2012-04-18 52 views
1

我做錯了什麼,或者它是谷歌Chromes的錯?
使用非捕捉和捕捉組的效果與沒有它們的效果相同。谷歌瀏覽器擴展正常化正則表達式全球標誌

RegExr顯示第一個預期結果。 http://regexr.com?30mjo

var text = 'startdate: 123456, enddate: 789012'; 
var unix = text.match(/(?:start|end)date: (\d+)/g); 
console.log(unix); 

實際結果

["startdate: 123456", "enddate: 789012"] 

預期結果

["123456", "789012"] or 
["startdate: 123456", "123456", "enddate: 789012", "789012"] 
+0

這似乎是'g'標誌使它行動怪異。沒有它,第一個結果返回罰款。我會調查更多。 – david 2012-04-18 22:10:21

+0

可能在'(\ d +)'之後在使用'g'時添加逗號?比如'...(\ d +),/ g);'?雖然真的不應該有所作爲...... – Kasapo 2012-04-18 22:19:28

回答

1

看起來規範說它應該以這種方式工作。

相關線上

4. Let matchStr be the result of calling the [[Get]] internal method of result with argument "0"

the ecmascript spec其中result 146頁上的是你從調用exec回陣列。

我一直無法找到一種方法,使這項工作,除了手動調用exec和收集像這樣的結果:

var regex = /(?:start|end)date: (\d+)/g; 
var text = 'startdate: 123456, enddate: 789012'; 

var result; 
var unix = []; 

while(result = regex.exec(text)){  
    unix.push(result[1]); 
} 

console.log(unix); 
+0

使用這種替代解決方案的作品,但我想我沒有這個全球標誌,因爲它是循環。但那是一個重大的錯誤!它變成了一個無止境的循環,它一直重複地加入第一場比賽。 – Kim 2012-04-19 19:07:00

-1

你正在做的事情是錯誤的。

這個怎麼樣?

/((?:start|end)date: (\d+))/g 
+0

那麼你能解釋一下如何讓非捕獲組工作嗎? – nnnnnn 2012-04-18 22:06:57

+0

爲什麼你不這樣做: '/(開始|結束)日期:(\ d +)/ g' 並且只使用第二個(或偶數)匹配組?這應該工作,除非開始/結束日期是可選的。只需循環播放結果並使用「i + = 2」作爲增量,抓住組2,4,6等......? – Kasapo 2012-04-18 22:10:31