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

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

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

    和風(fēng)細(xì)雨

    世上本無(wú)難事,心以為難,斯乃真難。茍不存一難之見(jiàn)于心,則運(yùn)用之術(shù)自出。

    Java 正則表達(dá)式的總結(jié)和一些小例子

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

    java.util.regex是一個(gè)用正則表達(dá)式所訂制的模式來(lái)對(duì)字符串進(jìn)行匹配工作的類庫(kù)包。它包括兩個(gè)類:Pattern和Matcher.
    Pattern是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式。 在java中,通過(guò)適當(dāng)命名的Pattern類可以容易確定String是否匹配某種模式.模式可以象匹配某個(gè)特定的String那樣簡(jiǎn)單,也可以很復(fù)雜,需要采用分組和字符類,如空白,數(shù)字,字母或控制符.因?yàn)镴ava字符串基于統(tǒng)一字符編碼(Unicode),正則表達(dá)式也適用于國(guó)際化的應(yīng)用程序.

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


    Matcher 一個(gè)Matcher對(duì)象是一個(gè)狀態(tài)機(jī)器,它依據(jù)Pattern對(duì)象做為匹配模式對(duì)字符串展開(kāi)匹配檢查。首先一個(gè)Pattern實(shí)例訂制了一個(gè)所用語(yǔ)法與PERL的類似的正則表達(dá)式經(jīng)編譯后的模式,然后一個(gè)Matcher實(shí)例在這個(gè)給定的Pattern實(shí)例的模式控制下進(jìn)行字符串的匹配工作。

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

    正則表達(dá)式中常見(jiàn)通配符:
    對(duì)于單字符串比較而言,使用正則表達(dá)式?jīng)]有什么優(yōu)勢(shì).Regex的真正強(qiáng)大之處在于體現(xiàn)在包括字符類和量詞(*,+,?)的更復(fù)雜的模式上.
    字符類包括:
    \d  數(shù)字
    \D  非數(shù)字
    \w  單字字符(
    0-9,A-Z,a-z)
    \W 非單字字符
    \s  空白(空格符,換行符,回車(chē)符,制表符)
    \S 非空白
    []  由方括號(hào)內(nèi)的一個(gè)字符列表創(chuàng)建的自定義字符類
    .   匹配任何單個(gè)字符
    下面的字符將用于控制將一個(gè)子模式應(yīng)用到匹配次數(shù)的過(guò)程.
    ?  重復(fù)前面的子模式0次到一次
    *  重復(fù)前面的子模式0次或多次
    + 重復(fù)前面的子模式一次到多次


    以下是實(shí)例部分:

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

    實(shí)例二:
     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可以重復(fù)一次或多次,因此moon,mon,mooon能匹配成功,而mono在n后多了一個(gè)o,和模式匹配不上.

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

    實(shí)例三:
     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+"失敗");
          }     
        }

    注:方括號(hào)中只允許的單個(gè)字符,模式“b[aeiou]n”指定,只有以b開(kāi)頭,n結(jié)尾,中間是a,e,i,o,u中任意一個(gè)的才能匹配上,所以數(shù)組的前五個(gè)可以匹配,后兩個(gè)元素?zé)o法匹配.

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

    實(shí)例四:
     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+"失敗");
          }     
        }

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

    實(shí)例五:
     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表示的是數(shù)字,而
    +表示一次或多次,所以模式\\d+就表示一位或多位數(shù)字.
    因此前四個(gè)能匹配上,最后一個(gè)因?yàn)?/span>+號(hào)是非數(shù)字字符而匹配不上.

    實(shí)例六:
    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+表示的是以多個(gè)單字字符開(kāi)頭,多個(gè)數(shù)字結(jié)尾的字符串,因此前四個(gè)能匹配上,最后一個(gè)因?yàn)閿?shù)字后還含有單字字符而不能匹配.

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

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

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

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

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

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

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

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

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

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

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

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

    實(shí)例十一:
    除了用+表示一次或多次,*表示0次或多次,?表示0次或一次外,還可以用{}來(lái)指定精確指定出現(xiàn)的次數(shù),X{2,5}表示X最少出現(xiàn)2次,最多出現(xiàn)5次;X{2,}表示X最少出現(xiàn)2次,多則不限;X{5}表示X只精確的出現(xiàn)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 + "失敗");
        }
    }

    實(shí)例十二:
    -表示從..到…,如[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 + "失敗");
          }
        }

    實(shí)例十三:不區(qū)分大小寫(xiě)匹配.
    正則表達(dá)式默認(rèn)都是區(qū)分大小寫(xiě)的,使用了Pattern.CASE_INSENSITIVE則不對(duì)大小寫(xiě)進(jìn)行區(qū)分.

     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 + "成功");
          }
        }

    實(shí)例十四:使用正則表達(dá)式劈分字符串.
     注意這里要把復(fù)雜的模式寫(xiě)在前面,否則簡(jiǎn)單模式會(huì)先匹配上.

    String input
    ="職務(wù)=GM 薪水=50000 , 姓名=職業(yè)經(jīng)理人 ; 性別=男  年齡=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);
        }

    實(shí)例十五:解析正則表達(dá)式中的文字,\\1對(duì)應(yīng)第一個(gè)小括號(hào)括起來(lái)的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));
    }


    實(shí)例十六:將單詞數(shù)字混合的字符串的單詞部分大寫(xiě).
        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 和風(fēng)細(xì)雨 閱讀(1505) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久久久国产精品免费免费搜索| 日韩免费高清播放器| 精品女同一区二区三区免费站| 亚洲国产a∨无码中文777| 中文字幕a∨在线乱码免费看| 国产成人亚洲综合无码| a级毛片免费全部播放无码| 国产亚洲免费的视频看| 免费A级毛片在线播放| 亚洲国语在线视频手机在线| 成人免费大片免费观看网站| 亚洲国产精品综合久久20| 午夜一区二区免费视频| 日韩精品免费一线在线观看 | 四虎影视在线永久免费观看| 国产成人综合亚洲绿色| 亚洲精品99久久久久中文字幕| 中文字幕成人免费高清在线视频 | 在线a免费观看最新网站| 亚洲a级片在线观看| 国产免费人视频在线观看免费| 香蕉国产在线观看免费| 久久久久久a亚洲欧洲AV| 99热在线精品免费全部my| 亚洲狠狠婷婷综合久久蜜芽| 国内精品久久久久久久亚洲| **实干一级毛片aa免费| 亚洲精品无码久久久久牙蜜区| 亚洲日本在线观看视频| 最近2019中文字幕免费直播| 亚洲av成本人无码网站| 亚洲AV无码成人精品区天堂| 天天摸夜夜摸成人免费视频| 好吊色永久免费视频大全| 亚洲婷婷综合色高清在线| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲精品国产手机| 免费一级特黄特色大片在线观看 | 日韩精品免费电影| 国产精品免费观看调教网| 亚洲欧洲国产综合AV无码久久|