簡體   English   中英

使用帶有勉強,貪婪和所有格修飾符的捕獲組

[英]Using capturing groups with reluctant, greedy, and possessive quantifiers

我在Oracle教程中練習Java的正則表達式。 為了更好地理解貪婪,勉強和所有格的量詞,我創建了一些示例。 我的問題是,這些量詞在捕獲群體時如何工作。 我不理解以這種方式使用量詞,例如,勉強的量詞看起來根本不起作用。 另外,我在互聯網上進行了很多搜索,只看到了諸如(。*?)之類的表達式。 人們為什么通常使用帶有這種語法的量詞而不是諸如“(.foo)??”之類的原因?

這是勉強的示例:

輸入您的正則表達式:(.foo)?

輸入輸入字符串以進行搜索:xfooxxxxxxfoo

我發現文本“”從索引0開始,到索引0結束。

我發現文本“”從索引1開始到索引1結束。

我發現文本“”從索引2開始到索引2結束。

我發現文本“”從索引3開始到索引3結束。

我發現文本“”從索引4開始到索引4結束。

我發現文本“”從索引5開始到索引5結束。

我發現文本“”從索引6開始到索引6結束。

我發現文本“”從索引7開始到索引7結束。

我發現文本“”從索引8開始到索引8結束。

我發現文本“”從索引9開始到索引9結束。

我發現文本“”從索引10開始到索引10結束。

我發現文本“”從索引11開始到索引11結束。

我發現文本“”從索引12開始到索引12結束。

我發現文本“”從索引13開始到索引13結束。

不情願,它不應該為索引0和4顯示“ xfoo”嗎? 這是所有格式的:

輸入您的正則表達式:(.foo)?+

輸入輸入字符串進行搜索:afooxxxxxxfoo

我發現文本“ afoo”從索引0開始到索引4結束

我發現文本“”從索引4開始到索引4結束。

我發現文本“”從索引5開始到索引5結束。

我發現文本“”從索引6開始到索引6結束。

我發現文本“”從索引7開始到索引7結束。

我發現文本“”從索引8開始到索引8結束。

我發現文本“ xfoo”從索引9開始到索引13結束。

我發現文本“”從索引13開始到索引13結束。

對於所有格,它不應該只嘗試輸入一次嗎? 我真的很困惑,因為嘗試了所有可能。

提前致謝 !

regex引擎(基本上)從左邊開始逐個檢查字符串的每個字符,以使它們適合您的模式。 它返回找到的第一個匹配項。

應用於子模式的勉強量詞意味着正則表達式引擎將優先使用(例如,首先嘗試)以下子模式。

看看在aabab上使用.*?b逐步發生什么:

aabab # we try to make '.*?' match zero '.', skipping it directly to try and 
^     # ... match b: that doesn't work (we're on a 'a'), so we reluctantly 
      # ... backtrack and match one '.' with '.*?'
aabab # again, we by default try to skip the '.' and go straight for b:
 ^    # ... again, doesn't work. We reluctantly match two '.' with '.*?'
aabab # FINALLY there's a 'b'. We can skip the '.' and move forward:
  ^   # ... the 'b' in '.*?b' matches, regex is over, 'aab' is a general match

在您的模式中,沒有與b等價的東西。 (.foo)是可選的,引擎將優先於模式的以下部分。

什么都沒有 ,並且匹配一個空字符串:找到了一個整體匹配項,並且始終是一個空字符串。


關於所有格量詞,您對它們的作用感到困惑。 它們對匹配次數沒有直接影響:尚不清楚您用於應用正則表達式的聊天工具,但它會查找全局匹配,這就是為什么它不會在第一個匹配時停止的原因。

有關它們的更多信息,請參見http://www.regular-expressions.info/possessive.html

同樣,正如HamZa指出的那樣, https ://stackoverflow.com/a/22944075成為正則表達式相關問題的重要參考。

暫無
暫無

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

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