代码片段
'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)
代码片段
'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)
在'a b'.match(/(a|b)/i)您的第一个示例中,您有一个未退出的捕获组。结果数组包含完整匹配的值 (ie a) 和第一个捕获组的值 (ie a)。
这就是为什么你有["a", "a"]
这里的答案在文档中:
如果正则表达式不包含
g标志,str.match() 将返回与 RegExp.exec() 相同的结果。返回的 Array 有一个额外的输入属性,其中包含已解析的原始字符串。此外,它还有一个 index 属性,表示字符串中匹配项的从零开始的索引。
因此'a b'.match(/(a|b)/i)与/(a|b)/i.exec('a b')返回匹配的字符串和捕获的组相同,因此,一个捕获组,一个额外的数组条目。
另一方面:
如果正则表达式包含该
g标志,则该方法返回一个包含所有匹配子字符串而不是匹配对象的数组。不返回捕获的组。如果没有匹配项,则该方法返回 null。