2013-01-08 261 views
6

能有人請解釋.+.+?「。+」和「。+?」之間的區別

的區別我有字符串:"extend cup end table"

  1. 模式e.+d的發現:extend cup end
  2. 模式e.+?d的發現:extendend

我知道+是一個或多個,而?是一個或零。 但我無法理解它是如何工作的。

+0

如下所述,它是貪婪和惰性量詞的區別。貪婪要儘可能多地消耗,儘可能少地懶惰。當量詞懶惰時,引擎將按照字符從左到右「建立字符串」字符。貪婪會做相反的事情。如果需要,它將盡可能多地消耗,然後從右向左放下幾個字符。查看以下示例:http://regex101.com/r/dG9zZ2和http://regex101.com/r/tP5xQ3 –

回答

16

兩者都會匹配任何一個或多個字符的序列。不同之處在於:

  • .+貪婪和消耗盡可能多的字符就可以了。
  • .+?不情願並消耗盡可能少的字符。

請參閱Java教程中的Differences Among Greedy, Reluctant, and Possessive Quantifiers

因此:

  • e.+d查找以e開頭和結尾d(和包含在它們之間的至少一個字符)的最長子串。
  • e.+?d找到最短的這樣的子字符串。在你的例子中,extendend是兩個這樣的非重疊匹配,所以它找到了兩個。
+0

剛剛在rubular.com上測試了這些表達式,而且我實際上爲什麼要添加?使表達式忽略「杯」。雖然你的答案並沒有詳細解釋。是否可以添加一行或兩行? – Henrik

+0

@Henrik結果是這樣的問題,原始問題中有奇怪的格式,我第一次嘗試沒有正確編輯 – Kapep

5

e.+?d匹配的'e',然後嘗試儘可能少的字符匹配越好(ungreedy或不願意)正則表達式,隨後'd'。這就是爲什麼以下2子串匹配:

extend cup end table 
^^^^^^  ^^^ 
    1   2 

e.+d匹配的'e',然後嘗試儘可能多的字符匹配越好(貪婪)正則表達式,隨後'd'。什麼情況是,第一'e'被發現,然後.+比賽一樣,因爲它可以(到行的末尾,或輸入):

extend cup end table 
^^^^^^^^^^^^^^^^^^^^ 

正則表達式引擎涉及到行的末尾(或輸入),並且不能匹配正則表達式模式中的'd'。所以它回溯到最後的'd'被看到。這就是爲什麼找到單個匹配:

extend cup end table 
^^^^^^^^^^^^^^<----- backtrack 
    1