正则表达式运算符的顺序 (..|.. ... ..|..)
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.Match
在bbac
中找到匹配项,您将获得的值是bb
,因为a
替代出现在bbb
之后。如果您使用Regex.Matches
,您将获得所有匹配项,并且bb
和a
都会出现在您的结果中。
此外,从左到右检查正则表达式模式这一事实清楚地表明,在非锚定替代组中,替代的顺序很重要。如果您使用(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'
以上是关于正则表达式运算符的顺序 (..|.. ... ..|..)的主要内容,如果未能解决你的问题,请参考以下文章