我不确定这是一个错误,还是我不了解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。
如果您有任何疑问,请告知我们。
\彼得
答案 0 :(得分:1)
第一个元素是正则表达式的完全匹配。如果你试过这个:
var str = "Here is somereg1 and somereg2" //I would expect
str.match(/.*(somereg1|somereg2)/)
您的结果将是["Here is somereg1 and somereg2", "somereg2"]
。
使用.exec(str)
方法会发生同样的行为。
编辑:关于"子括号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。