正则表达式中的管道符号混淆

12

为什么这段代码会返回true?

需要匹配的字符串:ab

正则表达式: /^a|b$/

但是当我加上括号,修改为以下形式:

正则表达式: /^(a|b)$/

它就会返回false


PHP、C++、Python,你问的是哪个正则表达式实现?(看起来像是 PHP PCRE。) - BoltClock
1
我相信他们对于我提供的代码有着相同的实现,所以我把它们放在了标签上 :/ - Rei
5个回答

20

9
/^a|b$/ 匹配以 a 开头或以 b 结尾的字符串。所以它可以匹配 afoobarbab/^(a|b)$/:匹配以 ab 开头和结尾的字符串。所以它只能匹配一个 ab,不能匹配其他内容。
这是因为正则表达式操作符中的选择符 | 优先级很低。
相关讨论请参考:这里

4
第一个意思是以 a 开头或以 b 结尾。
第二个意思是1个字符,可以是 ab

1

| 的优先级低于锚点,因此你要么使用 ^ab$(这是正确的),而不是第二个意思是“一个单字符字符串,要么是 a 要么是 b”(这是错误的)。


它有较低的优先级,而不是更高的优先级! - Daniel Hilgarth
嗯,当然,我是指它在之前被评估的 :) 我一直觉得这个低/高的事情很武断和反直觉... - Blindy
1
但它不是在之前评估 - 它是在之后评估。最低优先级最后评估,最高优先级最先评估。这应该很直观。我认为是“之前/之后”的术语导致了混淆,因为最外层/最大实际上暗示着较低的优先级。 - Wiseguy

1
^a|b$ 中,你匹配的是开头的 a 或结尾的 b
^(a|b)$ 中,你匹配的是仅有的字符 ab(在开头和结尾)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接