2012-04-18 61 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