正則表達(dá)式學(xué)習(xí)筆記貪婪、惰性和支配量詞

字號(hào):

貪婪量詞:
    先看整個(gè)字符串是不是一個(gè)匹配。如果沒有發(fā)現(xiàn)匹配,它去掉最后字符串中的最后一個(gè)字符,并再次嘗試。如果還是沒有發(fā)現(xiàn)匹配,那么 再次去掉最后一個(gè)字符串,這個(gè)過程會(huì)一直重復(fù)直到發(fā)現(xiàn)一個(gè)匹配或者字符串不剩任何字符。簡(jiǎn)單量詞都是貪婪量詞。
    惰性量詞:
    先看字符串中的第一個(gè)字母是不是一個(gè)匹配,如果單獨(dú)著一個(gè)字符還不夠,就讀入下一個(gè)字符,組成兩個(gè)字符的字符串。如果還沒有發(fā)現(xiàn)匹配,惰性量詞繼續(xù)從字符串中添加字符直到發(fā)現(xiàn)一個(gè)匹配或者整個(gè)字符串都檢查過也沒有匹配。惰性量詞和貪婪量詞的工作方式恰好相反。
    支配量詞:
    只嘗試匹配整個(gè)字符串。如果整個(gè)字符串不能產(chǎn)生匹配,不做進(jìn)一步嘗試。
    貪婪量詞 惰性量詞 支配量詞 描述
    -------------------------------------------------------------------------------------
    ? ?? ?+ 可以出現(xiàn)0次或1次,但至多出現(xiàn)1次
    * *? *+ 可以出現(xiàn)任意次,也可以不出現(xiàn)
    + +? ++ 出現(xiàn)1次或多次,但至少出現(xiàn)1次
    {n} {n}? {n}+ 一定出現(xiàn)n次
    {n,m} {n,m}? {n,m}+ 至少出現(xiàn)n次,但至多不能超過m次
    {n,} {n,}? {n,}+ 可以出現(xiàn)任意次,但至少出現(xiàn)n次
    例如:我們要從字符串a(chǎn)bbbaabbbaaabbb1234中獲得abbb,aabbb,aaabbb的匹配
    1、貪婪量詞
    1 var regexp = /.*bbb/g;
    2 var a = str.match(regexp);
    3 alert(a.length); //output:1
    4 alert(a[0]); //output:abbbaabbbaaabbb
    貪婪量詞的工作過程可以這樣表示:
    a)abbbaabbbaaabbb1234
    b)abbbaabbbaaabbb123
    c)abbbaabbbaaabbb12
    d)abbbaabbbaaabbb1
    e)abbbaabbbaaabbb //true
    可以看到,貪婪量詞在取得一次匹配后就會(huì)停止工作,雖然我們加了’g’(全局匹配)
    2、惰性量詞
    1 var regexp = /.*?bbb/g;
    2 var a = str.match(regexp);
    3 alert(a.length); //output:3
    4 alert(a[0]); //output:abbb
    5 alert(a[1]); //output:aabbb
    6 alert(a[2]); //output:aaabbb
    惰性量詞的工作過程可以這樣表示:
    a)a
    b)ab
    c)abb
    d)abbb //保存結(jié)果,并從下一個(gè)位置重新開始
    e)a
    f)aa
    g)aab
    h)aabb
    j)aabbb //保存結(jié)果,并從下一個(gè)位置重新開始
    e)a
    e)aa
    e)aaa
    e)aaab
    e)aaabb
    e)aaabbb //保存結(jié)果,并從下一個(gè)位置重新開始
    由于JS是不支持支配量詞的,所以支配量詞我們只能用JAVA來演示:
    1 String string = "abbbaabbbaaabbb1234";
    2 Pattern p = Pattern.compile(".*+bbb");
    3 Matcher m = p.matcher(string);
    4 System.out.println(m.find()); //output:false
    5
    因?yàn)橹淞吭~采用一刀切的匹配方式,如:
    a)abbbaabbbaaabbb1234 //false