天天看點

正規表達式 進階規則——四(貪婪與非貪婪)

比對次數中的貪婪與非貪婪

在使用修飾比對次數的特殊符号時,有幾種表示方法可以使同一個表達式能夠比對不同的次數,比如:"{m,n}", "{m,}", "?", "*","+",具體比對的次數随被比對的字元串而定。這種重複比對不定次數的表達式在比對過程中,總是盡可能多的比對。

比如,針對文本"dxxxdxxxd",

舉例如下:

    表達式            比對結果

   (d)(/w+)           "/w+"  将比對第一個  "d"  之後的所有字元"xxxdxxxd"

  (d)(/w+)(d)       "/w+" 将比對第一個 "d" 和最後一個 "d"之間的所有

                         字元 "xxxdxxx"。雖然 "/w+" 也能夠比對上最後一個 "d",

                         但是為了使整個表達式比對成功,"/w+" 可以 "讓出" 

                         它本來能夠比對的最後一個 "d"

由此可見,"/w+" 在比對的時候,總是盡可能多的比對符合它規則的字元。雖然第二個舉例中,它沒有比對最後一個 "d",但那也是為了讓整個表達式能夠比對成功。同理,帶 "*" 和 "{m,n}" 的表達式都是盡可能地多比對,帶 "?" 的表達式在可比對可不比對的時候,也是盡可能的 "要比對"。這 種比對原則就叫作 "貪婪" 模式 。

非貪婪模式:

在修飾比對次數的特殊符号後再加上一個 "?" 号,則可以使比對次數不定的表達式盡可能少的比對,使可比對可不比對的表達式,盡可能的 "不比對"。這種比對原則叫作 "非貪婪" 模式,也叫作 "勉強"模式。如果少比對就會導緻整個表達式比對失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再比對一些,以使整個表達式比對成功。

舉例如下,針對文本 "dxxxdxxxd" 舉例:

    表達式               比對結果

  (d)(/w+?)              "/w+?" 将盡可能少的比對第一個 "d" 之後的字元,

                              結果是:"/w+?" 隻比對了一個 "x"

  (d)(/w+?)(d)        為了讓整個表達式比對成功,"/w+?"  不得不比對 "xxx" 

                             才可以讓後邊的 "d" 比對,進而使整個表達式比對成功。

                              是以,結果是:"/w+?" 比對 "xxx"

更多的情況,舉例如下:

舉例 1:

表達式 "<td>(.*)</td>" 與字元串 "<td><p>aa</p></td><td><p>bb</p></td>" 比對時,比對的結果是:成功;比對到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整個字元串, 表達式中的 "</td>" 将與字元串中最後一個 "</td>" 比對。

舉例 2:

相比之下,表達式 "<td>(.*?)</td>" 比對舉例 1 中同樣的字元串時,将隻得到 "<td><p>aa</p></td>", 再次比對下一個時,可以得到第二個 "<td><p>bb</p></td>"。

正規表達式反向引用博文:http://blog.csdn.net/u011630575/article/details/53314116

繼續閱讀