在講貪婪模式和惰性模式之前叠穆,先回顧一下JS正則基礎(chǔ):
寫法基礎(chǔ):
①不需要雙引號少漆,直接用//包含 => /wehfwue123123/.test();
②反斜杠\表示轉(zhuǎn)義 =>/\.jpg$/
③用法基礎(chǔ):.test(str);
語法:
①錨點類
/^a/=>以"a"開頭
/\.jpg$/=>以".jpg"結(jié)尾
②字符類
[abc]:a或b或c
[0-9]:一個數(shù)字
[a-z]:一個字母
. ? ? ? :任意字符
③元字符
^:在[]里面用表示非,在[]外面用表示開頭
\d:[0-9]
\s:空白符
\w:[A-Za-z0-9_]
\D:[^\d]-非數(shù)字
\S:非空白符
④量詞
{m,n}:m到n次
元字符表示:
*:{0,}
?:{0,1}
+:{1,}
難點:貪婪模式/惰性模式
貪婪模式——在匹配成功的前提下痹束,盡可能多的去匹配
惰性模式——在匹配成功的前提下检疫,盡可能少的去匹配
解釋一:碼文并茂
使用正則表達式中的貪婪、惰性的量詞可以控制表達式匹配過程祷嘶,我們知道量詞?夺溢、*论巍、+的意義,可以指定相關(guān)模式出現(xiàn)的次數(shù)风响,默認的情況下我們使用的是貪婪量詞嘉汰,它的匹配過程是從整個字符串開始查看,如果不匹配就去掉最后一個状勤,再看看是否匹配鞋怀,如此循環(huán)一直到匹配或字符串空為止,如:
vars?="abbbaabbbaaabbb1234";
varre1=/.*bbb/g;//*是貪婪量詞
re1.test(s);
這個匹配過程將從整個字符串開始:
re1.test("abbbaabbbaaabbb1234");//false??持搜,則去掉最后一個字符4再繼續(xù)
re1.test("abbbaabbbaaabbb123");//false??密似,則去掉最后一個字符3再繼續(xù)
re1.test("abbbaabbbaaabbb12");//false??,則去掉最后一個字符2再繼續(xù)
re1.test("abbbaabbbaaabbb1");//false??葫盼,則去掉最后一個字符1再繼續(xù)
re1.test("abbbaabbbaaabbb");//true?残腌,結(jié)束
在貪婪量詞的后面加多一個?就變成了惰性量詞,它的匹配過程相反贫导,是從前面第一個開始抛猫,不匹配則加一個,如此循環(huán)直到字符串結(jié)束孩灯,以上面的為例子闺金。
vars?="abbbaabbbaaabbb1234";
varre1=/.*?bbb/g;//*?是惰性量詞
re1.test(s);
它的匹配過程如下:
re1.test("a");//false,??再加一個
re1.test("ab");//false,??再加一個
re1.test("abb");//false,??再加一個
re1.test("abbb");//true,??匹配了,保存這個結(jié)果峰档,再從下一個開始
re1.test("a");//false,??再加一個
re1.test("aa");//false,??再加一個
re1.test("aab");//false,??再加一個
re1.test("aabb");//false,??再加一個
re1.test("aabbb");//true,??匹配了败匹,保存這個結(jié)果匣距,再從下一個開始
......
三.解釋二:直戳原理
貪婪與惰性模式區(qū)別如下:
一、從語法角度看
貪婪模式用于匹配優(yōu)先量詞修飾的子表達式哎壳,匹配優(yōu)先量詞包括:“{m毅待,n}”、“{m归榕,}”尸红、“?”刹泄、“*”和“+”外里。
惰性模式用于匹配忽略優(yōu)先量詞修飾子表達式,匹配忽略優(yōu)先量詞包括:“{m特石,n}盅蝗?”、“{m姆蘸,}墩莫?”、“逞敷?狂秦?”、“*推捐?”和“+裂问?”。
二牛柒、從應(yīng)用角度看
兩者均影響被量詞修飾的子表達式匹配行為堪簿,貪婪模式在匹配成功的前提下盡可能多地匹配,而惰性模式則在匹配成功的前提下盡可能少匹配皮壁。惰性模式只被部分NFA引擎支持椭更。
三萤彩、從匹配原理看
能達到同樣匹配結(jié)果的情況下国拇,通常貪婪模式效率較高民褂。
惰性模式都可通過修改量詞修飾的子表達式轉(zhuǎn)換為貪婪模式锥惋。
貪婪模式可以與固化分組結(jié)合勿负,提升匹配效率眶痰,而惰性模式不行厕诡。