【问题标题】:Regex grouped OR operator matching strategy without global flag [duplicate]没有全局标志的正则表达式分组 OR 运算符匹配策略[重复]
【发布时间】:2019-05-02 21:25:16
【问题描述】:

代码sn-p

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我猜这是正确的解释,可以用下面的例子验证'a bc'.match(/(a|b)c/i) ,这会返回["bc", "b"]
    【解决方案2】:

    这里的答案在documentation

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

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

    另一方面:

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

    【讨论】:

    • 这是您的第一个文档片段的示例 ["a", "a", index: 0, input: "ab", groups: undefined],我无法回答这个问题即使通过第二个片段
    • 好的,既然我知道了答案,我可以看到你的问题解释了为什么只返回了g 标志["a"]。我实际上是想找出为什么第二个代码返回["a", "a"],你的回答也是正确的。谢谢。
    猜你喜欢
    • 2014-06-27
    • 2013-11-18
    • 1970-01-01
    • 2012-12-07
    • 2012-09-05
    • 2013-11-23
    • 1970-01-01
    • 2012-10-30
    • 2020-06-19
    相关资源
    最近更新 更多