2011-08-16 36 views
0

我正在使用一些JavaScript正則表達式值,並且遇到一些問題。變量startVals包含以下格式的字符串:x1,y1; x2,y2; x3,y3;下面的模式應該匹配每個值,並且確實在除Chrome之外的所有瀏覽器中都可以使用。在Chrome中,每個值都會返回第一個模式的值($ 1)。所以如果價值是10,10; 20,20; 30,30; Chrome將爲所有組$ 1至$ 6返回10的值。任何想法是什麼造成這個?JavaScript - Chrome - 正則表達式模式替換

var pattern = /(\d+),(\d+);(\d+),(\d+);(\d+),(\d+);/i; 
leftSlider.end.x = parseInt(startVals.replace(pattern,"$1")); 
leftSlider.end.y = parseInt(startVals.replace(pattern,"$2")); 
rightSlider.end.x = parseInt(startVals.replace(pattern,"$3")); 
rightSlider.end.y = parseInt(startVals.replace(pattern,"$4")); 
topSlider.end.x = parseInt(startVals.replace(pattern,"$5")); 
topSlider.end.y = parseInt(startVals.replace(pattern,"$6")); 

回答

1

慣用的方式做,這是

var match = startVals.match(/^(\d+),(\d+);(\d+),(\d+);(\d+),(\d+);$/) 

leftSlider.end.x = +match[1]; 
leftSlider.end.y = +match[2]; 
rightSlider.end.x = +match[3]; 
rightSlider.end.y = +match[4]; 
topSlider.end.x = +match[5]; 
topSlider.end.y = +match[6]; 

這在Chrome工作。

在Chrome中,

"10,10;20,20;30,30;".match(/^(\d+),(\d+);(\d+),(\d+);(\d+),(\d+);$/) 

產生

["10,10;20,20;30,30","10","10","20","20","30","30"] 
+0

你說得對,我在上面的信息輸入錯誤。應該是10,10; 20,20; 30,30 ;. – Brad

+0

+1此工作在這個jsFiddle:http://jsfiddle.net/jfriend00/TH78v/。 – jfriend00

0

我不知道爲什麼發生這種情況,但你可以試試這個,如果這就是所有的字符串包含:

var pattern = /\d+/g; 
var matches = pattern.exec(startVals); 

leftSlider.end.x = parseInt(matches[0], 10); 
leftSlider.end.y = parseInt(matches[1], 10); 
rightSlider.end.x = parseInt(matches[2], 10); 
rightSlider.end.y = parseInt(matches[3], 10); 
topSlider.end.x = parseInt(matches[4], 10); 
topSlider.end.y = parseInt(matches[5], 10); 

另外,不要將不區分大小寫的標誌應用於像只涉及數字和標點符號的正則表達式,它會減慢速度。也不要以這種方式執行那麼多的替換。

+0

我不明白這是如何工作的。我在Chrome的這個jsFiddle中運行它:http://jsfiddle.net/jfriend00/T3waJ/並且只得到一個匹配,而不是6. – jfriend00

+0

@ jfriend00:哎呀,它應該是這樣的:http://jsfiddle.net/minitech/gdsTv/ – Ryan

0

使用以下命令:

var pattern = /(\d+),(\d+);(\d+),(\d+);(\d+),(\d+)[;]?/i; 
var res = pattern.exec(startVals); //res is now an array with each match 

leftSlider.end.x = parseInt(res[1], 10); 
leftSlider.end.y = parseInt(res[2], 10); 
rightSlider.end.x = parseInt(res[3], 10); 
rightSlider.end.y = parseInt(res[4], 10); 
topSlider.end.x = parseInt(res[5], 10); 
topSlider.end.y = parseInt(res[6], 10); 
+1

不要在沒有基數的情況下使用'parseInt'。 '大多數解釋器都使用'parseInt(「010」)=== 8',但並非所有解釋器都是這樣,因爲[Annex E](http://es5.github.com/#E)表示「15.1.2.2:函數parseInt不再允許實現將以0字符開頭的字符串視爲八進制值。「 –

+0

很高興知道。我一直在哼唱幾年,假設10是硬而快的默認值。以上代碼被編輯。 – ghayes

+0

我很高興看到這個「特徵」死於一次冷酷而艱難的死亡。作爲一名程序員,我知道何時將八進制或十六進制傳遞給parseInt,並會告訴它。 – ghayes