2016-04-09 165 views

回答

5

這是一個非貪婪匹配。在[AB]*?中,正則表達式只尋找[AB],以使整個正則表達式匹配搜索的字符串,而貪婪版本[AB]*尋找儘可能多的出現次數。這是Perl的regexes的一個特性,因此可以在PCRE(Perl Compatible Regular Expressions)(參見repetition)和其他系統中找到Perl的定義。

的PCRE頁面給出了一個例子:

的其中[貪婪]給出問題的經典例子是嘗試匹配C語言的註釋。這些出現在/**/之間,並且在評論中可能出現個別的*/個字符。試圖通過應用模式來匹配C註釋:

/\*.*\*/ 

字符串

/* first comment */ not comment /* second comment */ 

失敗,因爲它由於.*項目的貪吃整個字符串匹配。

如果一個量詞後跟一個問號,它就不再是貪婪,而是次可能的最小數量相匹配,因此模式

/\*.*?\*/ 

做正確的事與C註釋。

2

Jonathan已經解釋了區別,但這裏有一個例子可以幫助你理解這裏發生了什麼。

鑑於字符串 「9AB」:

  • ([0-9][AB]*?)比賽唯一的 「9A」,因爲它很快將停止爲 「A」 匹配(懶惰)

  • ([0-9][AB]*)整個字符串匹配(「9AB 「),因爲它消耗‘A’和成功匹配以下‘B’(貪婪)

注意,第二個將匹配位數,隨後零個或多個(無限制)數量的「A」或「B」。

+0

謝謝你的例子,Maroun。我在Python中試過這個例子,而不是得到你的建議,我得到了「9」的結果。這是我的代碼: x = re.search(r'[0-9] [AB] *?','9AB') print x.group(0) – akaii

+0

哪一個是正確的結果,「9 「或」9A「? – akaii

+2

9是正確的,因爲允許'[AB]'的零匹配。當貪婪的量詞後面有些東西時,貪婪主要是重要的。 –