簡體   English   中英

所有格量詞到底如何工作?

[英]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.

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