關(guān)于js正則表達(dá)式的貪婪和懶惰模式

1、量詞

正則表達(dá)式的量詞有:* + ? {}
* : 匹配0次到多次
+ : 匹配1次到多次
? : 匹配0次或1次
{n,m} : 匹配至少n次,最多m次
{n} : 匹配n次
{0,} : 等價于*
{1,} : 等價于+
{0,1} : 等價于?

量詞默認(rèn)是貪婪模式,當(dāng)在量詞后面加上一個問號?時,就變成了懶惰模式。

2、貪婪模式

使用量詞(* + ? {})時,默認(rèn)為貪婪模式。
貪婪模式嘗試匹配最多字符,具體怎么做呢?
首先嘗試匹配整個字符串,如果匹配不成功,就去掉最后一個字符,并再次嘗試匹配,直到匹配成功或者字符串為空為止。
舉個例子:

demo1.js
let str1 = 'xxx123xxxxxxxxxx123xxx';
let regex1 = /.*123/; 
console.log(regex1.exec(str1)[0]);

輸出結(jié)果:'xxx123xxxxxxxxxx123'
分析demo1代碼,由于使用量詞,因此默認(rèn)為貪婪模式,會嘗試匹配最多字符,即匹配全部字符
第1次嘗試:'xxx123xxxxxxxxxx123xxx' 與 /.
123/ 不匹配
第2次嘗試:'xxx123xxxxxxxxxx123xx' 與 /.123/ 不匹配
第3次嘗試:'xxx123xxxxxxxxxx123x' 與 /.
123/ 不匹配
第4次嘗試:'xxx123xxxxxxxxxx123' 與 /.*123/ 匹配
因此匹配結(jié)果為:'xxx123xxxxxxxxxx123'

3、懶惰模式

在量詞(* + ? {})后直接加上?時,即為懶惰模式。
懶惰模式嘗試匹配最少字符,具體怎么做呢?
首先嘗試匹配空字符串,如果匹配不成功,就多讀取一個字符,并再次嘗試匹配,直到匹配成功或者整個字符串讀取完為止。
看下面例子:

demo2.js
let str2 = "xxx123xxxxxxxxxx123xxx";
let regex2 = /3*?/;
console.log(regex2.exec(str2)[0]);

輸出結(jié)果:''"

分析demo2代碼,由于在量詞后加入了?,因此采用懶惰模式,會嘗試匹配最少字符。
第1次嘗試:''"與 /3
?/ 匹配
因此匹配結(jié)果為:''"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容