能有人請解釋.+
和.+?
「。+」和「。+?」之間的區別
的區別我有字符串:"extend cup end table"
- 模式
e.+d
的發現:extend cup end
- 模式
e.+?d
的發現:extend
和end
我知道+
是一個或多個,而?
是一個或零。 但我無法理解它是如何工作的。
能有人請解釋.+
和.+?
「。+」和「。+?」之間的區別
的區別我有字符串:"extend cup end table"
e.+d
的發現:extend cup end
e.+?d
的發現:extend
和end
我知道+
是一個或多個,而?
是一個或零。 但我無法理解它是如何工作的。
兩者都會匹配任何一個或多個字符的序列。不同之處在於:
.+
是貪婪和消耗盡可能多的字符就可以了。.+?
是不情願並消耗盡可能少的字符。請參閱Java教程中的Differences Among Greedy, Reluctant, and Possessive Quantifiers。
因此:
e.+d
查找以e
開頭和結尾d
(和包含在它們之間的至少一個字符)的最長子串。e.+?d
找到最短的這樣的子字符串。在你的例子中,extend
和end
是兩個這樣的非重疊匹配,所以它找到了兩個。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
如下所述,它是貪婪和惰性量詞的區別。貪婪要儘可能多地消耗,儘可能少地懶惰。當量詞懶惰時,引擎將按照字符從左到右「建立字符串」字符。貪婪會做相反的事情。如果需要,它將盡可能多地消耗,然後從右向左放下幾個字符。查看以下示例:http://regex101.com/r/dG9zZ2和http://regex101.com/r/tP5xQ3 –