2

代码片段

'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)

4

2 回答 2

2

'a b'.match(/(a|b)/i)您的第一个示例中,您有一个未退出的捕获组。结果数组包含完整匹配的值 (ie a) 和第一个捕获组的值 (ie a)。

这就是为什么你有["a", "a"]

于 2018-11-30T17:53:57.380 回答
2

这里的答案在文档中:

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

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

另一方面:

如果正则表达式包含该g标志,则该方法返回一个包含所有匹配子字符串而不是匹配对象的数组。不返回捕获的组。如果没有匹配项,则该方法返回 null。

于 2018-11-30T17:55:06.053 回答