關於正規表示式的貪婪與非貪婪模式

2021-04-24 18:18:46 字數 1236 閱讀 7795

以前看正規表示式,但沒有注意到正規表示式的貪婪與非貪婪模式,今天在經典上看到了這麼段**:

匹配次數中的貪婪與非貪婪

在使用修飾匹配次數的特殊符號時,有幾種表示方法可以使同乙個表示式能夠匹配不同的次數,比如:"", "", "?", "*", "+",具體匹配的次數隨被匹配的字串而定。這種重複匹配不定次數的表示式在匹配過程中,總是盡可能多的匹配。比如,針對文字 "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+?" 匹配 "***"

舉例1:表示式 "(.*)" 與字串 "aa

bb" 匹配時

,匹配的結果是:成功;匹配到的內容是 "aa

bb" 整個字串, 表示式中的 "" 將與字串中最後乙個 "" 匹配。

舉例2:相比之下,表示式 "(.*?)" 匹配舉例1中同樣的字串時

,將只得到 "aa

", 再次匹配下乙個時,可以得到第二個 "bb

"。

正規表示式 貪婪與非貪婪

在一段時間內,一直不知道.和.之間的區別,一直單純的覺得兩者之間並沒有什麼區別,都是匹配任意字元,知道今天才知道其中的區別 首先從乙個簡單的問題的問題開始思考 有這樣乙個字串aaabaaab,和這樣的乙個正則.b,那麼.匹配的會是aaab還是aaabaaab呢?由此問題引發出來的就是貪婪與非貪婪模式...

正規表示式 貪婪與非貪婪匹配

貪婪匹配與非貪婪匹配 貪婪匹配 預設情況下,正規表示式使用最長匹配原則 也叫貪婪匹配原則 例如 要將 zoom 中匹配 zo?的部 分替換成 r 替換的的結果是 rom 如果要將 zoom 中匹配 zo 的部分替換成 r 替換後的結果是 rm 非貪婪匹配 當字元?緊隨其他限定符 之後時,匹配模式變成...

正規表示式貪婪與非貪婪模式

之前做程式的時候看到過正規表示式的貪婪與非貪婪模式,今天用的時候就想不起來了,現在這裡總結一下,以備自己以後用到注意。1.什麼是正規表示式的貪婪與非貪婪匹配 如 string str abcaxc patter p ab c 貪婪匹配 正規表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使...