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é)果為:''"