代码段
'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)
答案 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。