2011-05-31 88 views
7

有人能解釋我有什麼區別[0-9]+[0-9]++[0-9] +和[0-9] ++之間的區別是什麼?

+2

這不是一個重複的東西,但應該回答這個問題:http://stackoverflow.com/questions/4489551/what-is-double-plus-in-regular-expressions – Spudley 2011-05-31 11:06:26

+0

我從來沒有聽說過' ++'在正則表達式中,似乎很多其他人也沒有,但有點挖掘確實表明它是有效的。 – Spudley 2011-05-31 11:10:53

+0

對不起,我沒有找到。 – user557108 2011-05-31 11:11:04

回答

14

的PCRE引擎,它使用PHP的正則表達式,支持"possessive quantifiers"

量詞其次+是 「佔有慾」。他們吃盡可能多的人物,並且不會返回以匹配其餘的模式。因此.*abc匹配"aabc",但.*+abc不會因爲.*+吃整個字符串。擁有量詞可以用來加速處理。

和:

如果PCRE_UNGREEDY選項設置(此選項是不是在Perl中使用),那麼量詞是不是默認的貪婪,但個別的人可以通過以下他們做出貪婪一個問號。換句話說,它反轉了默認行爲。

的差別是這樣的:

/[0-9]+/ - one or more digits; greediness defined by the PCRE_UNGREEDY option 
/[0-9]+?/ - one or more digits, but as few as possible (non-greedy) 
/[0-9]++/ - one or more digits, but as many as possible (greedy, default) 

This snippet形象化的差在貪婪逐默認模式時。請注意,第一個代碼段在功能上與上一個代碼段相同,因爲附加的+(從某種意義上)是默認情況下已應用的。

This snippet在應用PCRE_UNGREEDY(默認爲默認模式)時可視化差異。看看默認值是如何顛倒的。

+0

爲什麼這會降低投票率?這個問題最初有一個'php'標籤。 – thirtydot 2011-05-31 11:13:47

+0

@thirtydot:它仍然如此。 – 2011-05-31 11:14:59

+2

只因爲我加回來:) – thirtydot 2011-05-31 11:17:45

4

++(和?+,*+{n,m}+)被稱爲possessive quantifiers

[0-9]+[0-9]++都匹配一個或多個ASCII數字,但第二個將不允許正則表達式引擎回溯到匹配,如果整個正則表達式成功需要這樣做。

實施例:

[0-9]+0 

字符串00相匹配,而[0-9]++0沒有。

在第一種情況下,[0-9]+首先匹配00,但後退一個字符以允許匹配以下0。在第二種情況下,++阻止了這一點,因此整個比賽失敗。

並非所有的正則表達式都支持這種語法;其他一些實施atomic groups(或甚至兩個)。

+0

謝謝你的回答! – user557108 2011-05-31 11:18:31

相關問題