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

Javascript 不带全局标志的正则表达式分组或运算符匹配策略,javascript,regex,string,string-matching,regex-group,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]至于'AB'。在'AB'中匹配/a | b/i。匹配/a | b/i在第一个示例中,您有一个不存在的捕获组。结果数组包含完全匹配的值(即a)和第一个捕获组的值(即a) 这就是为什么你有[a,a]答案如下: 如果正则表

代码片段

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

["a", "b"]
这是完全可以预料的,因为我们正在搜索带有“a”或“b”的子字符串 但是为什么呢

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

["a", "a"]
作为输出,a如何匹配两次? 不应该只是[a]至于'AB'。在'AB'中匹配/a | b/i

。匹配/a | b/i在第一个示例中,您有一个不存在的捕获组。结果数组包含完全匹配的值(即a)和第一个捕获组的值(即a)

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

答案如下:

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

因此,“a b”.match/a | b/i与/a | b/i.exec“a b”相同,它将返回匹配的字符串和捕获的组,因此,一个捕获组,一个额外的数组条目

另一方面:

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


这是您的第一个文档剪切的示例[a,a,索引:0,输入:a,b,组:未定义],我无法回答此问题,尽管即使通过第二次剪切,现在我知道了答案,我可以看到您的问题解释了为什么只返回带有g标志的[a]。我实际上是想找出为什么第二个代码返回[a,a],你的答案也是正确的。谢谢。我想这是正确的解释,可以用下面的例子“abc”来验证。匹配/a | bc/I,返回[bc,b]