當正規表示式中包含能接受重複的限定符(指定數量的**,例如*,等)時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。
考慮這個表示式:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。
有時,我們更需要懶惰匹配,也就是匹配盡可能少的字元。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上乙個問號?。這樣.*?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。現在看看懶惰版的例子吧:
a.*?b匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab和ab。
舉例1:
表示式 "(.*)" 與字串 "aa
bb" 匹配時,匹配的結果是:成功;匹配到的內容是 "aa
bb" 整個字串, 表示式中的 "" 將與字串中最後乙個 "" 匹配。
舉例2:
相比之下,表示式 "(.*?)" 匹配舉例1中同樣的字串時,將只得到 "aa
", 再次匹配下乙個時,可以得到第二個 "bb
"。懶惰限定符
*? 重複任意次,但盡可能少重複
+? 重複1次或更多次,但盡可能少重複
?? 重複0次或1次,但盡可能少重複
? 重複n到m次,但盡可能少重複
? 重複n次以上,但盡可能少重複
正規表示式 貪婪匹配與懶惰匹配
在學習之前,需要熟悉一下基本操作符的含義 表示換行外任意字元,表示重複前乙個數一次或多次。先舉個栗子 匹配乙個字串 import re res aabab r1 re.findall a.b res findall 返回列表型別 r2 re.findall a.b res print r1,r2 匹...
Java 正規表示式中的懶惰匹配
最近在搞乙個手機應用,其中一部分涉及到了webservice,由於webservice這部分也是自己做,所以在取回資料的時候,需要自己解析資料。string res pattern values pattern.compile receivetime value d matcher matchr v...
PHP正規表示式 貪婪與懶惰匹配
過去一直感覺這個地方很不好懂,今天又大致的看了一下,拿來跟大家共享一下,呵呵!當正則表示式中包含能接受重複的限定符 指定數量的 例如 等 時,通常的行為是 在使整個表示式能得到匹配的前提下 匹配盡可能多的字元。考慮這個表示式 a.b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab...