1. 程式人生 > >JS正則表示式:量詞的貪婪模式與惰性模式的區別

JS正則表示式:量詞的貪婪模式與惰性模式的區別

在說明貪婪模式與惰性模式區別之前,說明一下JS正則基礎:
1.寫法法基礎:
regexObj.test(str);例如/123/.test(‘123’);
2.基本語法
錨點:匹配一個位置
^表示起始位置;/^a/.test(‘str’);表示是否以a開頭
/\.jpg /.test(”);
\b表示單詞邊界;/\bis\b/表示單詞is
字元類:匹配一類字元中的一個
.表示任一字元(換行除外);
元字元:
\d:[0-9] ,\D:[^\d]
\s:空白符 ,\S:[^\s]
\w:[A-Za-z0-9_]單詞字元 \W[^\w]
量詞:

出現的的次數
{m,n}:m到n次
*等價{0,}(等價) ;0到無窮次
?等價{0,1};出現0次或者1次
+等價{1,};至少出現一次
3.\表示轉義,()用來捕獲

貪婪模式與惰性模式難點解析:
貪婪模式:匹配儘可能多的字元
首先比對整個字串是否匹配,如果匹配不成功則去掉字串最後一個字元再繼續進行匹配,以此類推直到匹配成功或不剩字元才停止。
惰性模式:匹配儘可能少的字元
首先從字串第一個字元開始匹配,如果匹配成功則停止匹配,否則加入第二個字元繼續匹配,依此類推直到匹配成功或不剩字元才停止。
圖文解釋:
這裡寫圖片描述
使用正則表示式中的貪婪、惰性的量詞可以控制表示式匹配過程,我們知道量詞?、*、+的意義,可以指定相關模式出現的次數,預設的情況下我們使用的是貪婪量詞,它的匹配過程是從整個字串開始檢視,如果不匹配就去掉最後一個,再看看是否匹配,如此迴圈一直到匹配或字串空為止,如:
var s =”abbbaabbbaaabbb1234”;

var re1=/.bbb/g;//是貪婪量詞

re1.test(s);

這個匹配過程將從整個字串開始:

re1.test(“abbbaabbbaaabbb1234”);//false ,則去掉最後一個字元4再繼續

re1.test(“abbbaabbbaaabbb123”);//false ,則去掉最後一個字元3再繼續

re1.test(“abbbaabbbaaabbb12”);//false ,則去掉最後一個字元2再繼續

re1.test(“abbbaabbbaaabbb1”);//false ,則去掉最後一個字元1再繼續

re1.test(“abbbaabbbaaabbb”);//true ,結束

在貪婪量詞的後面加多一個?就變成了惰性量詞,它的匹配過程相反,是從前面第一個開始,不匹配則加一個,如此迴圈直到字串結束,以上面的為例子。

var s =”abbbaabbbaaabbb1234”;

var re1=/.?bbb/g;//?是惰性量詞

re1.test(s);

它的匹配過程如下:

re1.test(“a”);//false, 再加一個

re1.test(“ab”);//false, 再加一個

re1.test(“abb”);//false, 再加一個

re1.test(“abbb”);//true, 匹配了,儲存這個結果,再從下一個開始

re1.test(“a”);//false, 再加一個

re1.test(“aa”);//false, 再加一個

re1.test(“aab”);//false, 再加一個

re1.test(“aabb”);//false, 再加一個

re1.test(“aabbb”);//true, 匹配了,儲存這個結果,再從下一個開始

一、從語法角度看
這裡寫圖片描述
貪婪模式用於匹配優先量詞修飾的子表示式,匹配優先量詞包括:“{m,n}”、“{m,}”、“?”、“*”和“+”。

惰性模式用於匹配忽略優先量詞修飾子表示式,匹配忽略優先量詞包括:“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。

二、從應用角度看

兩者均影響被量詞修飾的子表示式匹配行為,貪婪模式在匹配成功的前提下儘可能多地匹配,而惰性模式則在匹配成功的前提下儘可能少匹配。惰性模式只被部分NFA引擎支援。

三、從匹配原理看

能達到同樣匹配結果的情況下,通常貪婪模式效率較高。

惰性模式都可通過修改量詞修飾的子表示式轉換為貪婪模式。

貪婪模式可以與固化分組結合,提升匹配效率,而惰性模式不行。

參考連結:http://www.jianshu.com/p/889f3885a5bd