正規表示式中的懶惰匹配與非捕獲組

2021-09-07 21:48:41 字數 697 閱讀 9699

當正規表示式中包含能接受重複的限定符(指定數量的**,例如*,等)時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。

考慮這個表示式: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...