<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    憨厚生

    ----Java's Slave----
    ***Java's Host***

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      165 隨筆 :: 17 文章 :: 90 評論 :: 0 Trackbacks

    #

    轉 http://extjs2.javaeye.com/blog/394128

    正則表達式在字符串處理中經常使用,關于正則簡單的用法相信有一點程序基礎的人都懂得一些,這里就不介紹簡單基礎了。這里主要講解一下在JAVA中實現了的正則的高級用法-分組與捕獲。

        對于要重復單個字符,非常簡單,直接在字符后賣弄加上限定符即可,例如 a+ 表示匹配1個或一個以上的a,a?表示匹配0個或1個a。這些限定符如下所示:

      X? X,一次或一次也沒有
    X* X,零次或多次
    X+ X,一次或多次
    X{n} X,恰好 n 次
    X{n,} X,至少 n 次
    X{n,m} X,至少 n 次,但是不超過 m 次





    但是我們如果要對多個字符進行重復怎么辦呢?此時我們就要用到分組,我們可以使用小括號"()"來指定要重復的子表達式,然后對這個子表達式進行重復,例如:(abc)? 表示0個或1個abc 這里一個括號的表達式就表示一個分組。



       分組可以分為兩種形式,捕獲組和非捕獲組。



    捕獲組

    捕獲組可以通過從左到右計算其開括號來編號。例如,在表達式 ((A)(B(C))) 中,存在四個這樣的組:

    1     ((A)(B(C)))
    2     \A
    3     (B(C))
    4     (C)

    組零始終代表整個表達式

    之所以這樣命名捕獲組是因為在匹配中,保存了與這些組匹配的輸入序列的每個子序列。捕獲的子序列稍后可以通過 Back 引用在表達式中使用,也可以在匹配操作完成后從匹配器檢索。



    Back 引用 是說在后面的表達式中我們可以使用組的編號來引用前面的表達式所捕獲到的文本序列(是文本不是正則)。



    例如 ([" ']).* \1   其中使用了分組,\1就是對引號這個分組的引用,它匹配包含在兩個引號或者兩個單引號中的所有字符串,如,"abc" 或 " ' " 或 ' " '  ,但是請注意,它并不會對" a'或者 'a"匹配。原因上面已經說明,Back引用只是引用文本而不是表達式。



    非捕獲組

          以 (?) 開頭的組是純的非捕獲 組,它不捕獲文本,也不針對組合計進行計數。就是說,如果小括號中以?號開頭,那么這個分組就不會捕獲文本,當然也不會有組的編號,因此也不存在Back 引用。

          在Java中,支持的非捕獲組,有如下幾種:

     
       
      
    (?=X)     X,通過零寬度的正 lookahead
    (?!X)     X,通過零寬度的負 lookahead
    (?<=X)     X,通過零寬度的正 lookbehind
    (?<!X)     X,通過零寬度的負 lookbehind
     




    這四個非捕獲組用于匹配表達式X,但是不包含表達式的文本。

    (?=X ) 零寬度正先行斷言。僅當子表達式 X 在 此位置的右側匹配時才繼續匹配。例如,\w+(?=\d) 與后跟數字的單詞匹配,而不與該數字匹配。此構造不會回溯。
    (?!X) 零寬度負先行斷言。僅當子表達式 X 不在 此位置的右側匹配時才繼續匹配。例如,例如,\w+(?!\d) 與后不跟數字的單詞匹配,而不與該數字匹配。
    (?<=X) 零寬度正后發斷言。僅當子表達式 X 在 此位置的左側匹配時才繼續匹配。例如,(?<=19)99 與跟在 19 后面的 99 的實例匹配。此構造不會回溯。
    (?<!X) 零寬度負后發斷言。僅當子表達式 X 不在此位置的左側匹配時才繼續匹配。例如,(?<!19)99 與不跟在 19 后面的 99 的實例匹配






    舉例:



    上面都是理論性的介紹,這里就使用一些例子來說明一下問題:

       1、測試匹配性   (?<!4)56(?=9) 這里的含義就是匹配后面的文本56前面不能是4,后面必須是9組成。因此,可以匹配如下文本 5569  ,與4569不匹配。



      2 、提取字符串   提取 da12bka3434bdca4343bdca234bm   提取包含在字符a和b之間的數字,但是這個a之前的字符不能是c,b后面的字符必須是d才能提取。



            例如這里就只有3434這個數字滿足要求。那么我們怎么提取呢?

           首先我們寫出提取這個字符串的表達式: (?<!c)a(\d+)bd  這里就只有一個捕獲組(\d+)

           JAVA代碼片段如下:

    Pattern p = Pattern.compile("(?<!c)a(\\d+)bd");
    Matcher m = p.matcher("da12bca3434bdca4343bdca234bm");
    while(m.find()){
       System.out.println(m.group(1)); //我們只要捕獲組1的數字即可。結果 3434
       System.out.println(m.group(0)); // 0組是整個表達式,看這里,并沒有提煉出(?<!c)的字符 。結果 a3434bd
    }
        可以看到,非捕獲組,最后是不會返回結果的,因為它本身并不捕獲文本。

    posted @ 2009-07-16 09:43 二胡 閱讀(518) | 評論 (0)編輯 收藏

    僅列出標題
    共165頁: First 上一頁 32 33 34 35 36 37 38 39 40 下一頁 Last 
    主站蜘蛛池模板: 亚洲国产成+人+综合| 亚洲精品高清久久| 一本色道久久88亚洲精品综合 | 亚洲AV综合色区无码二区偷拍 | 久久免费看少妇高潮V片特黄| 国产亚洲一区二区三区在线不卡| 国产精品九九久久免费视频 | 中文字幕在线视频免费| 国产自偷亚洲精品页65页| 黄色网址免费在线观看| 亚洲美女又黄又爽在线观看| 日批视频网址免费观看| 久久青青草原亚洲av无码app| 91精品免费国产高清在线| 亚洲五月综合缴情婷婷| 日本不卡视频免费| 特级毛片在线大全免费播放| 亚洲色成人WWW永久网站| 8x8x华人永久免费视频| 亚洲人成7777影视在线观看| 日韩精品视频免费观看| 一级午夜a毛片免费视频| 亚洲国产综合专区在线电影| 国产精品成人观看视频免费| 亚洲AV无码专区在线观看成人| mm1313亚洲国产精品美女| a级毛片免费全部播放| 亚洲人成人77777在线播放| 在线观看免费亚洲| 国产在线精品观看免费观看| 337p日本欧洲亚洲大胆艺术| 精品国产精品久久一区免费式| 免费人成大片在线观看播放电影| 亚洲色精品88色婷婷七月丁香| 永久免费视频网站在线观看| 国产偷国产偷亚洲清高APP| 国精无码欧精品亚洲一区| 猫咪社区免费资源在线观看| 2022国内精品免费福利视频 | 亚洲AⅤ永久无码精品AA| 精品四虎免费观看国产高清午夜|