正则表达式分组或运算符匹配策略,不带全局标志

时间:2018-11-30 17:37:57

标签: javascript regex string string-matching regex-group

代码段

'a b'.match(/a|b/ig)

返回

["a", "b"]

这完全是我们期望的,因为我们正在搜索带有“ a”或“ b”的子字符串 但是为什么

'a b'.match(/(a|b)/i)

返回

["a", "a"]

作为输出,a如何匹配两次? ["a"]应该不是'a b'.match(/a|b/i)

2 个答案:

答案 0 :(得分:2)

filters中,有一个捕获组在第一个示例中没有退出。结果数组包含完全匹配的值(即'a b'.match(/(a|b)/i))和第一个捕获组的值(即a)。

这就是为什么您有a

答案 1 :(得分:2)

答案在documentation中:

  

如果正则表达式不包含special.Then(Test1, Test2);标志,则str.match()将返回与RegExp.exec()相同的结果。返回的数组具有额外的输入属性,其中包含已解析的原始字符串。此外,它还具有index属性,该属性表示字符串中匹配项的从零开始的索引。

因此,g'a b'.match(/(a|b)/i)相同,它将返回匹配的字符串和捕获的组,因此,一个捕获组,一个附加的数组条目。

另一方面:

  

如果正则表达式包含/(a|b)/i.exec('a b')标志,则该方法将返回一个包含所有匹配的子字符串而不是匹配对象的Array。捕获的组不返回。如果没有匹配项,则该方法返回null。