【问题标题】:Order of regular expression operator (..|.. ... ..|..)正则表达式运算符的顺序 (..|.. ... ..|..)
【发布时间】:2016-06-06 23:53:00
【问题描述】:

(..|. .. .|..) 运算符中表达式的优先级顺序是什么 - 从左到右、从右到左或其他?

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    从左到右,第一个替代匹配“获胜”,其他不检查。这是典型的 NFA 正则表达式行为。 regular-expressions.info Alternation page 提供了对该行为的良好描述。

    请注意,RegexOptions.RightToLeft 只会让正则表达式引擎从右到左检查输入字符串,修饰符不会影响正则表达式引擎如何处理模式本身。

    让我举例说明:如果您有一个(aaa|bb|a) 正则表达式并尝试使用Regex.Matchbbac 中找到匹配项,您将获得的值是bb,因为a 替代出现在bbb 之后。如果您使用Regex.Matches,您将获得所有匹配项,并且bba 都会出现在您的结果中。

    此外,从左到右检查正则表达式模式这一事实清楚地表明,在非锚定替代组中,替代的顺序很重要。如果您使用(a|aa|aaa) 正则表达式匹配abbccaa,第一个a 替代将匹配字符串中的每个a(请参阅regex demo)。添加单词边界后,您可以按任意顺序放置替代项(请参阅one more regex demo)。

    【讨论】:

    • 我认为有些正则表达式引擎总是采用最长的匹配,而不是这里的第一个。
    • 符合 POSIX 的正则表达式引擎需要最长的匹配。此外,Perl6 / pattern1 | pattern2 / 也匹配最长的备选方案(有一个 || 运算符在大多数其他风格中用作简单的 | 以产生第一个找到的备选方案)。
    • 在 Python 3.8.2 (CPython) 中,它似乎也是从左到右的,而不是最长的。示例:re.sub(r"3rd (col|column)", '_', '3rd column') 返回'_umn'
    猜你喜欢
    • 2012-10-30
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多