之前看正則表達式,但沒有注意到正則表達式的貪婪與非貪婪模式,今天在經典上看到了這麼段代碼: 正則表達式
< script > try { str = "<p>abcdefg</p><p>abcdefghijkl</p>"; re1 = str.match(/<p>[\W\w]+?<\/p>/ig); alert("非貪婪模式:\r\n\r\n1:" + re1[0] + "\r\n2:" + re1[1]); re1 = str.match(/<p>[\W\w]+<\/p>/ig); alert("貪婪模式:\r\n\r\n" + re1); re1 = str.match(/<p>(.+?)<\/p>/i); alert("非貪婪模式,且不要標記:\r\n\r\n1:" + re1[1]); re1 = str.match(/<p>(.+)<\/p>/i); alert("貪婪模式,且不要標記:\r\n\r\n" + re1[1]); } catch(e) { alert(e.description) } < /script>
匹配次數中的貪婪與非貪婪
貪婪模式:
在使用修飾匹配次數的特殊符號時,有幾種表示方法可使同一個表達式可以匹配不一樣的次數,好比:"{m,n}", "{m,}", "?", "*", "+",具體匹配的次數隨被匹配的字符串而定。這種重複匹配不定次數的表達式在匹配過程當中,老是儘量多的匹配。好比,針對文本 "dxxxdxxxd",舉例以下: spa
表達式 code |
匹配結果 ip |
(d)(\w+) ci |
"\w+" 將匹配第一個 "d" 以後的全部字符 "xxxdxxxd" 字符串 |
(d)(\w+)(d) get |
"\w+" 將匹配第一個 "d" 和最後一個 "d" 之間的全部字符 "xxxdxxx"。雖然 "\w+" 也可以匹配上最後一個 "d",可是爲了使整個表達式匹配成功,"\w+" 能夠 "讓出" 它原本可以匹配的最後一個 "d" io |
因而可知,"\w+" 在匹配的時候,老是儘量多的匹配符合它規則的字符。雖然第二個舉例中,它沒有匹配最後一個 "d",但那也是爲了讓整個表達式可以匹配成功。同理,帶 "*" 和 "{m,n}" 的表達式都是儘量地多匹配,帶 "?" 的表達式在可匹配可不匹配的時候,也是儘量的 "要匹配"。這 種匹配原則就叫做 "貪婪" 模式 。 table
非貪婪模式:
在修飾匹配次數的特殊符號後再加上一個 "?" 號,則可使匹配次數不定的表達式儘量少的匹配,使可匹配可不匹配的表達式,儘量的 "不匹配"。這種匹配原則叫做 "非貪婪" 模式,也叫做 "勉強" 模式。若是少匹配就會致使整個表達式匹配失敗的時候,與貪婪模式相似,非貪婪模式會最小限度的再匹配一些,以使整個表達式匹配成功。舉例以下,針對文本 "dxxxdxxxd" 舉例: class
表達式 |
匹配結果 |
"\w+?" 將盡量少的匹配第一個 "d" 以後的字符,結果是:"\w+?" 只匹配了一個 "x" |
|
爲了讓整個表達式匹配成功,"\w+?" 不得不匹配 "xxx" 纔可讓後邊的 "d" 匹配,從而使整個表達式匹配成功。所以,結果是:"\w+?" 匹配 "xxx" |
更多的狀況,舉例以下: