今天學習和理解了一下正規表示式貪婪與非貪婪模式,總結一下,與大家共享。
下邊給出一些例子:
貪婪模式:
在使用修飾匹配次數的特殊符號時,有幾種表示方法可以使同乙個表示式能夠匹配不同的次數,比如:"", "", "?", "*", "+",具體匹配的次數隨被匹配的字串而定。這種重複匹配不定次數的表示式在匹配過程中,總是盡可能多的匹配。比如,針對文字 "d***d***d",舉例如下:
貪婪模式:
表示式匹配結果
(d)(\w+)
"\w+" 將匹配第乙個 "d" 之後的所有字元 "***d***d"
(d)(\w+)(d)
"\w+" 將匹配第乙個 "d" 和最後乙個 "d" 之間的所有字元 "***d***"。
雖然 "\w+" 也能夠匹配上最後乙個 "d",但是為了使整個表示式匹配成功,
"\w+" 可以 "讓出" 它本來能夠匹配的最後乙個 "d"
由此可見,"\w+" 在匹配的時候,總是盡可能多的匹配符合它規則的字元。
雖然第二個舉例中,它沒有匹配最後乙個 "d",但那也是為了讓整個表示式能夠匹配成功。
同理,帶 "*" 和 "" 的表示式都是盡可能地多匹配,帶 "?" 的表示式在可匹配可不匹配的時候,
也是盡可能的 "要匹配"。這 種匹配原則就叫作 "貪婪" 模式 。
非貪婪模式:
在修飾匹配次數的特殊符號後再加上乙個 "?" 號,則可以使匹配次數不定的表示式盡可能少的匹配,使可匹配可不匹配的表示式,盡可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強" 模式。如果少匹配就會導致整個表示式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配一些,以使整個表示式匹配成功。舉例如下,針對文字 "d***d***d" 舉例:
表示式匹配結果
(d)(\w+?)
"\w+?" 將盡可能少的匹配第乙個 "d" 之後的字元,
結果是:"\w+?" 只匹配了乙個 "x"
(d)(\w+?)(d)
為了讓整個表示式匹配成功,"\w+?" 不得不匹配 "***" 才可以讓後邊的 "d" 匹配,
從而使整個表示式匹配成功。因此,結果是:"\w+?" 匹配 "***"
bb" 匹配時,匹配的結果是:成功;匹配到的內容是 "aa
bb" 整個字串, 表示式中的 "" 將與字串中最後乙個 "" 匹配。
舉例2:相比之下,表示式 "(.*?)" 匹配舉例1中同樣的字串時,將只得到 "aa
", 再次匹配下乙個時,可以得到第二個 "bb"。
------站在巨人的肩膀上。
正規表示式貪婪和非貪婪模式
限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的後面加上乙個?就可以實現非貪婪或最小匹配。文字 貪婪 下面的表示式匹配從開始小於符號 之間的所有內容。非貪婪 如果您只需要匹配開始和結束 h1 標籤,下面的非貪婪表示式只匹配 如果只想匹配開始的 h1 標籤,表示式則是 可以在grep中使用...
正規表示式 貪婪非貪婪模式
貪婪與非貪婪模式影響的是被量詞修飾的子表示式的匹配行為,貪婪模式在整個表示式匹配成功的前提下,盡可能多的匹配,而非貪婪模式在整個表示式匹配成功的前提下,盡可能少的匹配。非貪婪模式只被部分nfa引擎所支援。1.舉乙個例子 string str abcaxc patter p ab.c 貪婪匹配 正規表...
正規表示式 貪婪模式和非貪婪模式
在正規表示式中,存在兩種匹配模式。貪婪模式 正規表示式,在符合條件前提下,會盡可能多的匹配結果 懶惰模式 在正規表示式,如果符合條件的前提下,會盡可能少的匹配。在python中正規表示式預設是貪婪模式 個別語言也可能是非貪婪模式 貪婪模式就是總會嘗試匹配到更多的字元。非貪婪模式則反之,總是嘗試匹配盡...