零全零美(www.zzgwt.com)
          生活中的很多事情,并不像If...Else那么簡單!
          posts - 96,comments - 52,trackbacks - 0
          <2009年1月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          隨筆分類

          隨筆檔案

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 151887
          • 排名 - 402

          最新評論


          貪婪量詞:

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

           惰性量詞:

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

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

          貪婪量詞   惰性量詞    支配量詞                      描述
          -------------------------------------------------------------------------------------
            ?             ??             ?+                      可以出現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 零全零美 閱讀(3508) 評論(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
          搜來搜去都是這篇文章,抄襲成風啊。  回復  更多評論
            
          主站蜘蛛池模板: 旅游| 沙湾县| 阳原县| 法库县| 开化县| 光泽县| 玉田县| 邢台县| 东乡| 东山县| 昭苏县| 仙游县| 老河口市| 青海省| 泗阳县| 政和县| 通化市| 桓台县| 山阴县| 咸丰县| 如东县| 鹿泉市| 荃湾区| 榆中县| 绥中县| 新宁县| 辽中县| 安岳县| 贵溪市| 菏泽市| 铁岭市| 郑州市| 白山市| 江油市| 扶绥县| 收藏| 太保市| 翼城县| 修水县| 大理市| 竹溪县|