[英]How exactly does the possessive quantifier work?
在頁面末尾,嘗試解釋貪婪,勉強和所有格修飾符的工作方式: http : //docs.oracle.com/javase/tutorial/essential/regex/quant.html
但是我嘗試了一個例子,但我似乎並沒有完全理解它。
我將直接粘貼結果:
Enter your regex: .*+foo
Enter input string to search: xfooxxxxxxfoo
No match found.
Enter your regex: (.*)+foo
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.
為什么第一個reg.exp。 找不到匹配項,第二個匹配嗎? 這2個reg.exp。之間的確切區別是什么?
另一個量詞后面的+
表示“不允許正則表達式引擎回溯到先前標記已匹配的任何內容”。 (請參閱此處的所有格量詞教程)。
因此,當您將.*foo
應用於"xfooxxxxxxfoo"
, .*
首先會匹配整個字符串。 然后,由於無法匹配foo
,因此正則表達式引擎將回溯到可能的情況,當.*
匹配"xfooxxxxxx"
且foo
匹配"foo"
時實現匹配。
現在,附加的+
可以防止發生回溯,因此匹配失敗。
當您寫(.*)+foo
。 +
含義完全不同; 現在它的意思是“前面的一個或多個令牌”。 順便說一下,您已經創建了嵌套量詞。 如果將該正則表達式應用於"xfoxxxxxxxxxfox"
類的字符串,則會遇到災難性的回溯 。
所有格量詞會采用整個字符串,並檢查它是否匹配,否則匹配失敗。 在您的情況下,xfooxxxxxxfoo與.*+
匹配,但是您要求另一個 foo
(不存在),因此匹配器失敗。
貪婪的量詞首先執行相同的操作,但沒有失敗,而是“退后”並再次嘗試:
xfooxxxxxxfoo fail
xfooxxxxxxfo fail
xfooxxxxxxf fail
xfooxxxxxx match
在第二個正則表達式中,您需要通過混淆分組機制來提出其他要求。 您要求“一個或多個(。*)匹配項”,因為+現在與()有關,並且存在一個匹配項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.