PHP正規表示式 貪婪與懶惰匹配

2021-06-10 05:33:59 字數 811 閱讀 7310

過去一直感覺這個地方很不好懂,今天又大致的看了一下,拿來跟大家共享一下,呵呵!

正則表示式中包含能接受重複的限定符(指定數量的**,例如*,等)時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。考慮這個表示式:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。

有時,我們更需要懶惰匹配,也就是匹配盡可能少的字元。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上乙個問號?。這樣.*?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。現在看看懶惰版的例子吧:

a.*?b匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab和ab(為什麼第乙個匹配是aab而不是ab?簡單地說,最先開始的區配最有最大的優先權——the match that begins earliest wins)。

表5.懶惰限定符

*?

重複任意次,但盡可能少重複

+?

重複1次或更多次,但盡可能少重複

??重複0次或1次,但盡可能少重複

?重複n到m次,但盡可能少重複

?重複n次以上,但盡可能少重複

PHP正規表示式 貪婪與懶惰匹配

過去一直感覺這個地方很不好懂,今天又大致的看了一下,拿來跟大家共享一下,呵呵!當正則表示式中包含能接受重複的限定符 指定數量的 例如 等 時,通常的行為是 在使整個表示式能得到匹配的前提下 匹配盡可能多的字元。考慮這個表示式 a.b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab...

正規表示式 貪婪匹配與懶惰匹配

在學習之前,需要熟悉一下基本操作符的含義 表示換行外任意字元,表示重複前乙個數一次或多次。先舉個栗子 匹配乙個字串 import re res aabab r1 re.findall a.b res findall 返回列表型別 r2 re.findall a.b res print r1,r2 匹...

正規表示式 貪婪與懶惰

當正規表示式中包含能接受重複的限定符時,通常的行為是 在使整個表示式能得到匹配的前提下 匹配盡可能多的字元。考慮這個表示式 a.b 它將會匹配最長的以a開始,以b結束的字串 如果用它來搜尋aabab 的話,它會匹配整個字串aabab 這被稱為貪婪匹配。有時,我們更需要懶惰匹配,也就是匹配盡可能少的字...