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

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

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

    和風細雨

    世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

    Java 正則表達式的總結和一些小例子

    字符串處理是許多程序中非常重要的一部分,它們可以用于文本顯示,數據表示,查找鍵和很多目的.在Unix下,用戶可以使用正則表達式的強健功能實現這些目的,從Java1.4起,Java核心API就引入了java.util.regex程序包,它是一種有價值的基礎工具,可以用于很多類型的文本處理,如匹配,搜索,提取和分析結構化內容.

    java.util.regex是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。它包括兩個類:Pattern和Matcher.
    Pattern是一個正則表達式經編譯后的表現模式。 在java中,通過適當命名的Pattern類可以容易確定String是否匹配某種模式.模式可以象匹配某個特定的String那樣簡單,也可以很復雜,需要采用分組和字符類,如空白,數字,字母或控制符.因為Java字符串基于統一字符編碼(Unicode),正則表達式也適用于國際化的應用程序.

    Pattern類的方法簡述
    方法 說明
    static Pettern compile(String regex,int flag) 編譯模式,參數regex表示輸入的正則表達式,flag表示模式類型(Pattern.CASE_INSENSITIVE 表示不區分大小寫)
    Matcher match(CharSequence input) 獲取匹配器,input時輸入的待處理的字符串
    static boolean matches(String regex, CharSequence input) 快速的匹配調用,直接根據輸入的模式regex匹配input
    String[] split(CharSequence input,int limit) 分隔字符串input,limit參數可以限制分隔的次數


    Matcher 一個Matcher對象是一個狀態機器,它依據Pattern對象做為匹配模式對字符串展開匹配檢查。首先一個Pattern實例訂制了一個所用語法與PERL的類似的正則表達式經編譯后的模式,然后一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工作。

    Matcher類的方法簡述
    方法 說明
    boolean matches() 對整個輸入字符串進行模式匹配.
    boolean lookingAt() 從輸入字符串的開始處進行模式匹配
    boolean find(int start) start處開始匹配模式
    int groupCount() 返回匹配后的分組數目
    String replaceAll(String replacement) 用給定的replacement全部替代匹配的部分
    String repalceFirst(String replacement) 用給定的replacement替代第一次匹配的部分 
    Matcher appendReplacement(StringBuffer sb,String replacement) 根據模式用replacement替換相應內容,并將匹配的結果添加到sb當前位置之后
    StringBuffer appendTail(StringBuffer sb) 將輸入序列中匹配之后的末尾字串添加到sb當前位置之后.

    正則表達式中常見通配符:
    對于單字符串比較而言,使用正則表達式沒有什么優勢.Regex的真正強大之處在于體現在包括字符類和量詞(*,+,?)的更復雜的模式上.
    字符類包括:
    \d  數字
    \D  非數字
    \w  單字字符(
    0-9,A-Z,a-z)
    \W 非單字字符
    \s  空白(空格符,換行符,回車符,制表符)
    \S 非空白
    []  由方括號內的一個字符列表創建的自定義字符類
    .   匹配任何單個字符
    下面的字符將用于控制將一個子模式應用到匹配次數的過程.
    ?  重復前面的子模式0次到一次
    *  重復前面的子模式0次或多次
    + 重復前面的子模式一次到多次


    以下是實例部分:

    實例一:
    正則式是最簡單的能準確匹配一個給定String的模式,模式與要匹配的文本是等價的.靜態的Pattern.matches方法用于比較一個String是否匹配一個給定模式.例程如下:
    String data
    ="java";
    boolean result=Pattern.matches("java",data);

    實例二:
     String[] dataArr = { "moon""mon""moon""mono" };

        
    for (String str : dataArr) {
          String patternStr
    ="m(o+)n";
          
          
    boolean result = Pattern.matches(patternStr, str);
          
    if (result) {
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"成功");
          }
          
    else{
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"失敗");
          }     
        }

    模式是”m(o
    +)n”,它表示mn中間的o可以重復一次或多次,因此moon,mon,mooon能匹配成功,而mono在n后多了一個o,和模式匹配不上.

    注:
    +表示一次或多次;?表示0次或一次;*表示0次或多次.

    實例三:
     String[] dataArr = { "ban""ben""bin""bon" ,"bun","byn","baen"};

        
    for (String str : dataArr) {
          String patternStr
    ="b[aeiou]n";
          
          
    boolean result = Pattern.matches(patternStr, str);
          
    if (result) {
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"成功");
          }
          
    else{
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"失敗");
          }     
        }

    注:方括號中只允許的單個字符,模式“b[aeiou]n”指定,只有以b開頭,n結尾,中間是a,e,i,o,u中任意一個的才能匹配上,所以數組的前五個可以匹配,后兩個元素無法匹配.

    方括號[]表示只有其中指定的字符才能匹配.

    實例四:
     String[] dataArr = { "been""bean""boon""buin" ,"bynn"};

        
    for (String str : dataArr) {
          String patternStr
    ="b(ee|ea|oo)n";
          
          
    boolean result = Pattern.matches(patternStr, str);
          
    if (result) {
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"成功");
          }
          
    else{
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"失敗");
          }     
        }

    如果需要匹配多個字符,那么[]就不能用上了,這里我們可以用()加上
    |來代替,()表示一組,|表示或的關系,模式b(ee|ea|oo)n就能匹配been,bean,boon等.
    因此前三個能匹配上,而后兩個不能.

    實例五:
     String[] dataArr = { "1""10""101""1010" ,"100+"};

        
    for (String str : dataArr) {
          String patternStr
    ="\\d+";
          
          
    boolean result = Pattern.matches(patternStr, str);
          
    if (result) {
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"成功");
          }
          
    else{
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"失敗");
          }     
        }

    注:從前面可以知道,\\d表示的是數字,而
    +表示一次或多次,所以模式\\d+就表示一位或多位數字.
    因此前四個能匹配上,最后一個因為
    +號是非數字字符而匹配不上.

    實例六:
    String[] dataArr = { "a100""b20""c30""df10000" ,"gh0t"};

        
    for (String str : dataArr) {
          String patternStr
    ="\\w+\\d+";
          
          
    boolean result = Pattern.matches(patternStr, str);
          
    if (result) {
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"成功");
          }
          
    else{
            System.out.println(
    "字符串"+str+"匹配模式"+patternStr+"失敗");
          }     
        }

    模式\\w
    +\\d+表示的是以多個單字字符開頭,多個數字結尾的字符串,因此前四個能匹配上,最后一個因為數字后還含有單字字符而不能匹配.

    實例七:
     String str="薪水,職位 姓名;年齡 性別";
        String[] dataArr 
    =str.split("[,\\s;]");
        
    for (String strTmp : dataArr) {
          System.out.println(strTmp); 
        }

    String類的split函數支持正則表達式,上例中模式能匹配”,”,單個空格,”;”中的一個,split函數能把它們中任意一個當作分隔符,將一個字符串劈分成字符串數組.

    實例八:
    String str="2007年12月11日";
    Pattern p 
    = Pattern.compile("[年月日]"); 
    String[] dataArr 
    =p.split(str);
    for (String strTmp : dataArr) {
    System.out.println(strTmp);
    }

    Pattern是一個正則表達式經編譯后的表現模式 ,它的split方法能有效劈分字符串.
    注意其和String.split()使用上的不同.

    實例九:
    String str="10元 1000人民幣 10000元 100000RMB";
    str
    =str.replaceAll("(\\d+)(元|人民幣|RMB)""$1¥");
    System.out.println(str);

    上例中,模式“(\\d
    +)(元|人民幣|RMB)”按括號分成了兩組,第一組\\d+匹配單個或多個數字,第二組匹配元,人民幣,RMB中的任意一個,替換部分$1表示第一個組匹配的部分不變,其余組替換成¥.

    替換后的str為¥
    10 ¥1000 ¥10000 ¥100000

    實例十:
    Pattern p = Pattern.compile("m(o+)n",Pattern.CASE_INSENSITIVE);

    // 用Pattern類的matcher()方法生成一個Matcher對象
    Matcher m = p.matcher("moon mooon Mon mooooon Mooon");
    StringBuffer sb 
    = new StringBuffer();

    // 使用find()方法查找第一個匹配的對象
    boolean result = m.find();

    // 使用循環找出模式匹配的內容替換之,再將內容加到sb里
    while (result) {
    m.appendReplacement(sb, 
    "moon");
    result 
    = m.find();
    }
    // 最后調用appendTail()方法將最后一次匹配后的剩余字符串加到sb里;
    m.appendTail(sb);

    System.out.println(
    "替換后內容是" + sb.toString());

    實例十一:
    除了用+表示一次或多次,*表示0次或多次,?表示0次或一次外,還可以用{}來指定精確指定出現的次數,X{2,5}表示X最少出現2次,最多出現5次;X{2,}表示X最少出現2次,多則不限;X{5}表示X只精確的出現5次.
    例程:
    String[] dataArr 
    = { "google""gooogle""gooooogle""goooooogle","ggle"};

    for (String str : dataArr) {
        String patternStr 
    = "g(o{2,5})gle";

        
    boolean result = Pattern.matches(patternStr, str);
        
    if (result) {
            System.out.println(
    "字符串" + str + "匹配模式" + patternStr + "成功");
        } 
    else {
            System.out.println(
    "字符串" + str + "匹配模式" + patternStr + "失敗");
        }
    }

    實例十二:
    -表示從..到…,如[a-e]等同于[abcde]
     String[] dataArr 
    = { "Tan""Tbn""Tcn""Ton","Twn"};

        
    for (String str : dataArr) {
          String regex 
    = "T[a-c]n";

          
    boolean result = Pattern.matches(regex, str);
          
    if (result) {
            System.out.println(
    "字符串" + str + "匹配模式" + regex + "成功");
          } 
    else {
            System.out.println(
    "字符串" + str + "匹配模式" + regex + "失敗");
          }
        }

    實例十三:不區分大小寫匹配.
    正則表達式默認都是區分大小寫的,使用了Pattern.CASE_INSENSITIVE則不對大小寫進行區分.

     String patternStr
    ="ab";
        Pattern pattern
    =Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
        
        String[] dataArr 
    = { "ab""Ab""AB"};
        
        
    for (String str : dataArr) {
          Matcher matcher
    =pattern.matcher(str);
          
          
    if(matcher.find()){
            System.out.println(
    "字符串" + str + "匹配模式" + patternStr + "成功");
          }
        }

    實例十四:使用正則表達式劈分字符串.
     注意這里要把復雜的模式寫在前面,否則簡單模式會先匹配上.

    String input
    ="職務=GM 薪水=50000 , 姓名=職業經理人 ; 性別=男  年齡=45 ";
        String patternStr
    ="(\\s*,\\s*)|(\\s*;\\s*)|(\\s+)";
        Pattern pattern
    =Pattern.compile(patternStr);
        
        String[] dataArr
    =pattern.split(input);
        
        
    for (String str : dataArr) {
          System.out.println(str);
        }

    實例十五:解析正則表達式中的文字,\\1對應第一個小括號括起來的group1.
    String regex="<(\\w+)>(\\w+)</\\1>";
    Pattern pattern
    =Pattern.compile(regex);
        
    String input
    ="<name>Bill</name><salary>50000</salary><title>GM</title>";
        
    Matcher matcher
    =pattern.matcher(input);
        
    while(matcher.find()){
          System.out.println(matcher.group(
    2));
    }


    實例十六:將單詞數字混合的字符串的單詞部分大寫.
        String regex="([a-zA-Z]+[0-9]+)";   
        Pattern pattern
    =Pattern.compile(regex);
        
        String input
    ="age45 salary500000 50000 title";
        
        Matcher matcher
    =pattern.matcher(input);
        
        StringBuffer sb
    =new StringBuffer();
        
        
    while(matcher.find()){
          String replacement
    =matcher.group(1).toUpperCase();
          matcher.appendReplacement(sb, replacement);
        }
        matcher.appendTail(sb);
        
        System.out.println(
    "替換完的字串為"+sb.toString());

    posted on 2008-02-22 10:27 和風細雨 閱讀(1508) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品9999久久久久无码| 亚洲午夜精品久久久久久人妖| 日韩亚洲国产高清免费视频| 日韩精品成人无码专区免费| 久久久久亚洲AV片无码| 你懂的免费在线观看| 亚洲色婷婷综合久久| 在线看片免费人成视频久网下载 | 亚洲视频在线观看免费| 男女一边摸一边做爽的免费视频| 亚洲综合久久夜AV | 韩国免费a级作爱片无码| 久久久久亚洲?V成人无码| 中国人免费观看高清在线观看二区| 久久国产成人精品国产成人亚洲 | 免费人成年轻人电影| 黄色网页免费观看| 亚洲人成色7777在线观看不卡| jizz免费在线观看| 16女性下面无遮挡免费| 亚洲成人福利在线观看| 中文字幕乱码免费看电影| 亚洲AV无码精品色午夜果冻不卡| 午夜老司机永久免费看片| 亚洲图片校园春色| 国产精品免费_区二区三区观看| 日日摸日日碰夜夜爽亚洲| 国产亚洲欧洲Aⅴ综合一区| 污视频在线观看免费| 亚洲色大成网站www尤物| 亚洲免费日韩无码系列| 免费福利电影在线观看| 国产日本亚洲一区二区三区| 四虎国产精品免费视| 久久精品免费一区二区三区| 亚洲成人黄色在线| 亚洲高清偷拍一区二区三区| 亚洲人成色77777在线观看| 亚洲男人第一无码aⅴ网站| 久久久久久国产精品免费免费男同 | 亚洲喷奶水中文字幕电影|