正则表达式运算符的顺序 (..|.. ... ..|..)

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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'

以上是关于正则表达式运算符的顺序 (..|.. ... ..|..)的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 运算符优先级

正则表达式 - 匹配规则

正则表达式 之运算符优先级

[第四节] 正则表达式 - 运算符优先级

小白的正则表达式的学习之旅-04

运算符优先级