我不确定这是错误还是我自己不了解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)正则表达式。

10-07 23:42