正規表示式 貪婪模式

admin發表於2018-09-11

有寡慾之人,必有貪婪之徒。

從正面來講,清心寡慾是一種達觀豁達的生活態度,但從另一個角度來看,未免失之消極。

相同的道理,貪婪從另一個角度觀察,未嘗不是積極向上的表現,尤其是作為年輕人的我們。

寡慾也好,貪婪也罷,一切的關鍵在於必須遵守規則底線。

在正規表示式中,如果說寡慾之人是惰性匹配模式,那貪婪之徒必定是貪婪匹配模式。

關於惰性匹配模式可以參閱正規表示式惰性匹配一章節。

首先看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="antzone"; 
let reg=/a.*n/;
console.log(str.match(reg));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/11/102423ctebodtnhatbaiti.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

特別說明:如果在重複量詞的右邊不新增問號(?),預設都是採用貪婪匹配。

/a.*n/會匹配以字元"a"開頭,以"n"結尾的字串,正則中間是採用重複量詞星號(*)。

匹配結果是"antzon"而不是"an",由此可見匹配量詞竭盡所能匹配所能匹配到的內容。

一.貪婪匹配概念:

所謂的貪婪匹配就是在符合規則的條件下,正規表示式儘可能多的匹配內容。

實現貪婪匹配模式的核心是正規表示式重複量詞,正是由於它的存在,才有貪婪的可能。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="antzone"; 
let reg=/\w/g;
console.log(str.match(reg));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/11/102521w9y9em9atzfxx777.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可能有朋友會有這樣的疑問,程式碼沒有使用重複量詞,不是也匹配到了字串的每一個字元嗎。

這其實是一個誤讀,上面正規表示式進行了7次匹配,每一次只會匹配到一個字元。

程式碼修改如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="antzone"; 
let reg=/\w+/g;
console.log(str.match(reg));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/11/102601kwa19y5yl9lh51xc.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上面使用了重複量詞+,採用貪婪匹配模式,那麼每一次匹配都儘可能多的匹配字元。

二.加強鞏固:

下面通過一段經典的程式碼例項來加深一下對於貪婪匹配的掌握。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="<div><ul><li></li></ul></div>";
console.log(str.match(/(<.*>)(<.*>)/));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/11/102638o7nlhcnplxqrypte.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上面正規表示式中,有多個正規表示式重複量詞同時使用。

根據先到先得的原則,左側的重複量詞在保證右側重複量詞最小匹配的情況下,儘可能多的匹配。

那麼第一個子表示式(<.*>)會匹配到</ul>,那麼第二個子表示式匹配最後的</div>。

也就是在滿足自己最大欲望的同時,給別人也留了一線生機。

相關文章