零全零美(www.zzgwt.com)
          生活中的很多事情,并不像If...Else那么簡單!
          posts - 96,comments - 52,trackbacks - 0


          貪婪量詞:

          先看整個字符串是不是一個匹配。如果沒有發現匹配,它去掉最后字符串中的最后一個字符,并再次嘗試。如果還是沒有發現匹配,那么    再次去掉最后一個字符串,這個過程會一直重復直到發現一個匹配或者字符串不剩任何字符。簡單量詞都是貪婪量詞。

           惰性量詞:

          先看字符串中的第一個字母是不是一個匹配,如果單獨著一個字符還不夠,就讀入下一個字符,組成兩個字符的字符串。如果還沒有發現匹配,惰性量詞繼續從字符串中添加字符直到發現一個匹配或者整個字符串都檢查過也沒有匹配。惰性量詞和貪婪量詞的工作方式恰好相反。

          支配量詞:
          只嘗試匹配整個字符串。如果整個字符串不能產生匹配,不做進一步嘗試。

          貪婪量詞   惰性量詞    支配量詞                      描述
          -------------------------------------------------------------------------------------
            ?             ??             ?+                      可以出現0次或1次,但至多出現1次
            *             *?            *+                      可以出現任意次,也可以不出現
            +             +?            ++                      出現1次或多次,但至少出現1次
            {n}        {n}?           {n}+                   一定出現n次
            {n,m}    {n,m}?       {n,m}+               至少出現n次,但至多不能超過m次
            {n,}       {n,}?          {n,}+                 可以出現任意次,但至少出現n次

          例如:我們要從字符串abbbaabbbaaabbb1234中獲得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
            可以看到,貪婪量詞在取得一次匹配后就會停止工作,雖然我們加了'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 //保存結果,并從下一個位置重新開始
            
            e)a
            f)aa
            g)aab
            h)aabb
            j)aabbb //保存結果,并從下一個位置重新開始
            
            e)a
            e)aa
            e)aaa
            e)aaab
            e)aaabb
            e)aaabbb  //保存結果,并從下一個位置重新開始

          由于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

          因為支配量詞采用一刀切的匹配方式,如:
            a)abbbaabbbaaabbb1234 //false
          posted on 2009-01-07 14:54 零全零美 閱讀(3500) 評論(3)  編輯  收藏 所屬分類: 正則表達式

          FeedBack:
          # re: 正則表達式學習筆記(4) 貪婪、惰性和支配量詞
          2009-01-08 09:25 | 于翔
          好強啊  回復  更多評論
            
          # re: 正則表達式學習筆記(4) 貪婪、惰性和支配量詞
          2009-01-09 13:53 | 劉凱毅
          上次提了下懶散匹配。沒想到 blog主 這寫的這麼詳細,學習了。
          貪婪、惰性和支配量詞 說的這麼清楚真太清楚了。
          為了表示與blog共同學習 正則,我就寫點和本文擦邊的,拋磚引玉把:
          目的:
            使用 javascript a[0];
                 java ma.group(0); 來取得你想要的值
            一正則一匹配,后面不需要多余動作。
          內容》abbbaabbbaaabbb1234
          $1預查 或 非消費-匹配
          比如上面適用 .*bbb 》a[1]
             alert(a.length); //output:3
             alert(a[0]); //output:abbb
             alert(a[1]); //output:aabbb
             alert(a[2]); //output:aaabbb
          正則》 aa.*?(?=aaa)
          原則上》 必須要知道要匹配后文字
          適用》 javascript/java
          結果》 a[0] //output:aabbb

          $2 非消費-匹配
            正則》(?<=b{3}).*(?=a{3})
            適用》java
            結果》ma.group(0) = aabbb
            原則》只要知道需要匹配的前后文字,不需要知道自己怎么樣。


          不太爽的地方:非消費-后匹配,javascript 沒有
            就是 (?<=b{3}).*(?=a{3}) 的這個。







            回復  更多評論
            
          # re: 正則表達式學習筆記(4) 貪婪、惰性和支配量詞[未登錄]
          2010-08-08 15:46 | ty
          搜來搜去都是這篇文章,抄襲成風啊。  回復  更多評論
            
          主站蜘蛛池模板: 高雄市| 万年县| 荆州市| 丰顺县| 平湖市| 隆昌县| 措勤县| 兴义市| 志丹县| 仁寿县| 亚东县| 马山县| 绥宁县| 凌源市| 墨玉县| 宜州市| 江西省| 赤城县| 会东县| 南陵县| 临西县| 四会市| 榆社县| 千阳县| 泗洪县| 英超| 平南县| 巴林右旗| 永宁县| 奉化市| 汶川县| 鄯善县| 海淀区| 鸡西市| 长宁县| 普兰县| 凉山| 鹿泉市| 碌曲县| 清原| 施甸县|