【发布时间】:2016-06-06 23:53:00
【问题描述】:
(..|. .. .|..) 运算符中表达式的优先级顺序是什么 - 从左到右、从右到左或其他?
【问题讨论】:
(..|. .. .|..) 运算符中表达式的优先级顺序是什么 - 从左到右、从右到左或其他?
【问题讨论】:
从左到右,第一个替代匹配“获胜”,其他不检查。这是典型的 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)。
【讨论】:
/ pattern1 | pattern2 / 也匹配最长的备选方案(有一个 || 运算符在大多数其他风格中用作简单的 | 以产生第一个找到的备选方案)。
re.sub(r"3rd (col|column)", '_', '3rd column') 返回'_umn'