javascript正则表达式匹配/ exec问题

时间:2014-12-04 11:14:00

标签: javascript regex exec match

我不确定这是一个错误,还是我不了解javascript正则表达式方法的行为(最后一个可能更有可能)。

问题是我无法获得类型/(某些东西)/的正则表达式来处理没有全局标识符的match或exec方法,例如。 /(somereg1 | somereg2)/ G

当全局标识符存在时,方法会正确返回它找到的每个实例。但是当它不存在时,两种方法都只能正确地返回它们找到的第一个匹配。问题是他们两次退货!?例如在句子中:

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/(somereg1|somereg2)/)

返回“somereg1” 相反,它返回“somereg1,somereg1”

检查这个jsfiddle: http://jsfiddle.net/myf43ay1/

代码应该是相当自我解释的。第一个例子来自W3schools。

如果您有任何疑问,请告知我们。

\彼得

3 个答案:

答案 0 :(得分:1)

第一个元素是正则表达式的完全匹配。如果你试过这个:

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/.*(somereg1|somereg2)/)

您的结果将是["Here is somereg1 and somereg2", "somereg2"]

使用.exec(str)方法会发生同样的行为。

您可能希望了解.match.exec

编辑:关于"子括号macthes",在正则表达式中,括号分隔capture groups。所以,如果你有这个正则表达式:

/.*(somereg1).*?(somereg2)/

您的.match结果为["Here is somereg1 and somereg2", "somereg1", "somereg2"]。因此,正如您所看到的,结果数组包含完整匹配,后跟所有捕获组匹配。

要强制某个群组不被捕获,只需使用(?:)分隔:

"Here is somereg1 and somereg2".match(/.*(?:somereg1).*?(somereg2)/);
// Will result in ["Here is somereg1 and somereg2", "somereg2"]

注意:在JavaScript中,捕获组不适用于全局(/g)正则表达式。

答案 1 :(得分:1)

修改第二行,如下所示:

str.match(/somereg1|somereg2/)

答案 2 :(得分:0)

您可以使用以下内容获取req。结果:

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/(?=(somereg1|somereg2))/)

至于比赛和执行。我会说匹配,因为它使用正则表达式对象,并防止你双重转义和所有的字符串用作re。