2014-09-24 20 views
2

我在讀Java中的正則表達式。而且我明白,佔有量詞不會回溯併發布角色,以便讓其他組達成匹配。 但我無法想象任何在現實中使用佔有量詞的情況。 我已經閱讀了一些資源,說由於所有格量詞不會回溯,他們不需要記住每個字符在輸入字符串中的位置,這有助於顯着提高正則表達式引擎的性能。 我已經通過編寫一個例子測試了這個:什麼是Java正則表達式中所有格量詞的用法?

我有一個字符串包含大約數千位數。

首先我定義了一個貪婪:String regex = "(\d+)";

然後我算花的時間。

二:我改變佔有慾:String regex = "(\d++)";

而且我算它花了時間,但我沒有看到在時間

我誤解的東西有什麼區別?

此外,任何人都可以給我一些使用佔有量詞的具體情況嗎?

關於術語:在書「Java Regular Expressions Taming the Java.Util.Regex Engine by Mehran Habibi」中,他使用術語「possessive qualifiers」,而我在互聯網上閱讀時,人們使用「Possessive quantifier」。哪一個是正確的呢?

+4

一個很好的[閱讀](http://www.rexegg.com/regex-quantifiers.html#possessive) – hwnd 2014-09-24 00:29:53

+1

@hwnd感謝您的鏈接。非常有用 – adhg 2014-09-24 00:32:43

+2

「量詞」是正確的詞;它會將*數量*方面添加到適用的任何內容中。哈比比書中充斥着sl termin的術語和徹頭徹尾的錯誤;我建議你把它扔掉,然後閱讀[Friedl](http://regex.info/book.html)。 [食譜](http://www.regular-expressions.info/cookbook.html)也很好。 – 2014-09-24 01:00:22

回答

2

擁有量詞是貪婪的量詞(他們嘗試匹配儘可能多的字符)並且不會回溯(如果所有格量詞到目前爲止可能匹配失敗)。

正常(貪婪)量詞

假設有以下的正則表達式:

^([A-Za-z0-9]+)([A-Z0-9][A-Z0-9])(.*) 

正則表達式旨在匹配「一個或多個字母數字字符(獨立於案件)[A-Za-z0-9],並應以兩個字母數字字符結尾,然後可以發生ny字符。

任何服從這個約束的字符串都會匹配。 AAA也是如此。可以聲稱第二個和第三個A應該屬於第二個組,但這會導致字符串不匹配的事實。正則表達式因此具有智能(使用動態編程),以知道何時離開(第一)船。

非貪婪量詞

現在可能出現的一個問題是,第一組是「太貪婪」用於數據提取的目的。假設你有以下字符串AAAAAAA。幾個細分是可能的:(A)(AA)(AAAA),(AA)(AA)(AAA)等默認情況下,正則表達式中的每個組儘可能貪婪(只要這對字符串是否仍然匹配不起作用)。正則表達式將在(AAAAA)(AA)()中細分字符串。如果你想以這種方式提取數據,從一個字符被傳遞的那一刻起,從[A-Z0-9]範圍中的兩個字符出現的那一刻起,正則表達式應該移動到下一個組。

爲了實現這一點,你可以這樣寫:

^([A-Za-z0-9]+?)([A-Z0-9][A-Z0-9])(.*) 

字符串AAAAAAA將匹配(A)(AA)(AAAA)

佔有慾量詞

佔有慾量詞是貪婪的量詞,但一旦有可能,他們絕不會放棄一個字符到另一個組。例如:

^([A-Z]++)([H-Zw])(.*) 

如果你會寫^([A-Z]+)([H-Z])(.*)字符串AH0將被匹配。第一組是貪婪(取A),但由於進食(有時使用這個詞)H會導致字符串不匹配,所以願意放棄H。使用所有格量詞。該組織也不願意放棄H。因此,它吃掉了AH。第二組只剩下0,但第二組不能吃那個角色。結果,正則表達式在使用非所有格量詞會導致匹配成功的情況下失敗。字符串Aw將成功匹配,因爲第一個組對w不感興趣...

1

默認情況下,量化是貪婪的。他們會盡可能地匹配。所有格量詞防止回溯,意味着正則表達式匹配的內容不會被回溯到,即使這會導致整個匹配失敗。正如Regex Tutorial (Possessive Quantifiers)說...

佔有慾量詞是防止正則表達式引擎從 嘗試所有的排列方式。這主要用於性能 的原因。您還可以使用佔有量詞來消除某些 匹配。

相關問題