簡體   English   中英

Java正則表達式中的所有格限定詞有什么用?

[英]what are possessive quantifiers in Java regular expression used for?

我正在閱讀有關Java中的正則表達式的信息。 而且我知道所有格量詞不會回退和釋放角色,不會給其他小組提供匹配的機會。 但是我無法弄清楚現實中使用所有格量詞的任何情況。 我已經閱讀了一些資源,他們說,由於所有格量詞不會回溯,因此它們不需要記住輸入字符串中每個字符的位置,這有助於顯着提高正則表達式引擎的性能。 我已經通過編寫示例進行了測試:

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

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

然后我數了一下時間。

第二:我更改為所有格: String regex = "(\\d++)";

我也數了一下時間,但是我看不出時間有什么不同

我誤會了嗎?

此外,有人可以給我一些使用所有格修飾詞的特定情況嗎?

關於該術語:在Java Regular Expressions Taming the Java.Util.Regex Engine by Mehran Habibi撰寫的“ Java Regular Expressions Taming the Java.Util.Regex Engine by Mehran Habibi ”一書中,他使用了“ possessive qualifiers ”一詞,而我在互聯網上閱讀時,人們使用了“ Possessive quantifier ”。 哪一個是正確的還是兩者都正確?

擁有量詞是貪婪的量詞(它們嘗試匹配盡可能多的字符)並且不回溯(如果所有格量詞走得太遠,匹配可能會失敗)。

普通(貪婪)量詞

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

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

正則表達式旨在匹配“一個或多個字母數字字符(不區分大小寫) [A-Za-z0-9]並且應以兩個字母數字字符結尾,然后可以出現任何字符。

符合此約束的任何字符串都將匹配。 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])(.*)

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

默認情況下,量詞是貪婪的。 他們將嘗試盡可能地匹配。 所有格量詞可防止回溯,這意味着即使正則表達式匹配的內容導致整個匹配失敗,也不會回溯到正則表達式匹配的內容。 如正則表達式教程(所有格量詞)中所述 ...

擁有量詞是防止正則表達式引擎嘗試所有排列的一種方法。 這主要是出於性能方面的考慮。 您還可以使用所有格量詞來消除某些匹配項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM