2011-06-08 70 views
5

這段代碼如何返回true?正則表達式管道混淆

字符串匹配:ab

模式:/^a|b$/

但是當我把括號內是這樣的:

模式:/^(a|b)$/

它將然後返回false

+0

PHP,C++,Python,你正在問哪些正則表達式的實現? (看起來像PHP PCRE) – BoltClock 2011-06-08 13:22:15

+1

我相信他們對我提供的代碼有相同的實現,所以我把它們放在標籤上:/ – Rei 2011-06-08 13:24:13

回答

12

沒有括號的第一種模式相當於/(^a)|(b$)/
原因是,該管道操作符(「交替操作者」)具有所有正則表達式運算符的優先級最低:http://www.regular-expressions.info/alternation.html(第一標題下方的第三段)

+0

哇,你的答案很快!非常感謝你! – Rei 2011-06-08 14:16:53

+0

這個答案需要更新,因爲鏈接被破壞! – 2013-11-27 12:43:10

+0

@JoshDavenport:謝謝,完成 – 2013-11-27 15:46:03

4

第一種方式是以a開頭或以b結尾。

第二種意思是1個字符,ab

7

/^a|b$/其與a開頭或結尾的字符串相匹配一個b。所以它匹配afoo,barb,a,b

/^(a|b)$/:匹配以ab開頭和結尾的字符串。所以它匹配ab而沒有別的。

發生這種情況是因爲更改|在正則表達式運算符中的優先級很低。

Related discussion

+1

+1清楚的解釋&&例子&&理由_why_,不僅僅是_what_ – Wiseguy 2011-06-08 14:39:45

1

|具有比錨較低的優先級,所以你說無論是^ab$(這是真的),而不是第二個一個,這意味着「一個字符串,要麼ab」 (這是錯誤的)。

+0

它有一個**低**優先級,而不是更高的優先! – 2011-06-08 13:32:15

+0

呃,當然,我的意思是評估*之前* :)我總是發現這個更低/更高的東西是任意的,反直覺的... – Blindy 2011-06-08 13:34:46

+1

但它沒有評估_before_ - 它的評估_after_。最低優先級最後評估,最高優先最先評估。這應該是直觀的。我認爲這是導致混淆的術語「之前/之後」,因爲最大/最大實際上暗示着較低的優先級。 – Wiseguy 2011-06-08 14:32:43

1

^a|b$中,您匹配的是開頭的a或結尾的b

^(a|b)$中,您匹配的是ab是唯一的字符(在開頭和結尾處)。