我不确定这是错误还是我自己不了解javascript regex方法的行为(可能是最后一个)。
问题是我无法获得类型为((something | something)/)的正则表达式来使用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。
如果您有任何疑问,请告诉我。
\彼得
最佳答案
第一个元素是正则表达式的完全匹配。如果您尝试这样做:
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
)正则表达式。