JavaRegex入門1

來源:互聯網
上載者:User

標籤:

1.定義:Regex是一種可以用於模式比對和替換的規範,一個Regex就是由普通的字元(例如字元a到z)以及特殊字元(元字元)組成的文字模式,它 用以描述在尋找文字主體時待匹配的一個或多個字串。Regex作為一個模板,將某個字元模式與所搜尋的字串進行匹配。

    2.用途:

  • 字串匹配(字元匹配)
  • 字串尋找
  • 字串替換
  • 字串分割

    例如:

  • 從網頁中揪出email地址
  • IP地址是否正確
  • 從網頁中揪出連結

    3.java中處理Regex的類:

  • java.lang.String
  • java.util.regex.Pattern:模式類:字串要被匹配的這麼一個模式,該模式本身已經被編譯過,使用的話效率要高很多。
  • java.util.regex.Matcher:匹配類:這個模式比對某個字串所產生的結果,這個結果可能會有很多個。

    4:下面通過一個小程式簡單介紹一下Regex

 

import java.util.regex.Matcher;import java.util.regex.Pattern;public class Test {    public static void main(String[] args) {        //matches()判斷字串是否匹配某個運算式,"."表示任何一個字元        p("abc".matches("..."));        //將字串"a2389a"中的數字用*替換,\d 表示“0--9”數字        p("a2389a".replaceAll("\\d", "*"));        //將任何是a--z的字串長度為3的字串進行編譯,這樣可以加快匹配速度        Pattern p = Pattern.compile("[a-z]{3}");        //進行匹配,並將匹配結果放在Matcher對象中        Matcher m = p.matcher("abc");        p(m.matches());        //上面的三行代碼可以用下面一行代碼代替        p("abc".matches("[a-z]{3}"));    }        public static void p(Object o){        System.out.println(o);    }} 

下面是列印結果

truea****atruetrue

 現在通過一些實驗來說明Regex的匹配規則,這兒是Greedy方式

  .              任何字元

 a?             a一次或一次也沒有

 a*             a零次或多次

 a+            a一次或多次

 a{n}?      a恰好 n 次

 a{n,}?       a至少n次 

 a{n,m}?   a至少n次,但是不超過m次

 

        //初步認識. * + ?        p("a".matches("."));//true        p("aa".matches("aa"));//true        p("aaaa".matches("a*"));//true        p("aaaa".matches("a+"));//true        p("".matches("a*"));//true        p("aaaa".matches("a?"));//false        p("".matches("a?"));//true        p("a".matches("a?"));//true        p("1232435463685899".matches("\\d{3,100}"));//true        p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));//false        p("192".matches("[0-2][0-9][0-9]"));//true

 

[abc]                        a、b 或 c(簡單類)

[^abc]                      任何字元,除了 a、b 或 c(否定)

[a-zA-Z]                   a 到 z 或 A 到 Z,兩頭的字母包括在內(範圍)

[a-d[m-p]]                a 到 d 或 m 到 p:[a-dm-p](並集)

[a-z&&[def]]             d、e 或 f(交集)

[a-z&&[^bc]]             a 到 z,除了 b 和 c:[ad-z](減去)

[a-z&&[^m-p]]            a 到 z,而非 m 到 p:[a-lq-z](減去)

 

        //範圍        p("a".matches("[abc]"));//true        p("a".matches("[^abc]"));//false        p("A".matches("[a-zA-Z]"));//true        p("A".matches("[a-z]|[A-Z]"));//true        p("A".matches("[a-z[A-Z]]"));//true        p("R".matches("[A-Z&&[RFG]]"));//true

 

\d                          數字:[0-9]

\D                         非數字: [^0-9]

\s                          空白字元:[ \t\n\x0B\f\r]

\S                         非空白字元:[^\s]

\w                         單詞字元:[a-zA-Z_0-9]

\W                        非單詞字元:[^\w]

 

         //認識\s \w \d         p("\n\r\t".matches("\\s(4)"));//false        p(" ".matches("\\S"));//false        p("a_8 ".matches("\\w(3)"));//false        p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+"));//true        p("\\".matches("\\\\"));//true

 

 邊界匹配器

      ^                                          行的開頭

      $                                          行的結尾

      \b                                        單詞邊界

      \B                                        非單詞邊界

      \A                                        輸入的開頭

      \G                                       上一個匹配的結尾

      \Z                                       輸入的結尾,僅用於最後的結束符(如果有的話)

      \z                                       輸入的結尾

 

        //邊界匹配        p("hello sir".matches("^h.*"));//true        p("hello sir".matches(".*ir$"));//true        p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));//true        p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));//false        //空白行:一個或多個(空白並且非分行符號)開頭,並以分行符號結尾        p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));//true

 方法解析

matches():匹配整個字串

find():匹配子字串

lookingAt():永遠從整個字串的開頭開始匹配

//email        p("[email protected]".matches("[\\w[.-]][email protected][\\w[.-]]+\\.[\\w]+"));//true                //matches() find() lookingAt()        Pattern p = Pattern.compile("\\d{3,5}");        Matcher m = p.matcher("123-34345-234-00");                //將整個"123-34345-234-00"用Regex引擎尋找匹配,當到第一個"-"不匹配了,就停止,        //但不會將不匹配的"-"吐出來        p(m.matches());        //將不匹配的"-"吐出來        m.reset();                //1:當前面有p(m.matches());尋找子字串從"...34345-234-00"開始        //將會是第1,2兩個查到"34345"和"234" 後面2個查不到為false        //2:當前面有p(m.matches());和m.reset();尋找子字串從"123-34345-234-00"開始        //將為true,true,true,false        p(m.find());        p(m.start()+"---"+m.end());        p(m.find());        p(m.start()+"---"+m.end());        p(m.find());        p(m.start()+"---"+m.end());        p(m.find());        //要是沒找到就會報異常java.lang.IllegalStateException        //p(m.start()+"---"+m.end());                p(m.lookingAt());        p(m.lookingAt());        p(m.lookingAt());        p(m.lookingAt());

字串替換:下面這種方法對於字串替換非常靈活

        //字串替換        //Pattern.CASE_INSENSITIVE大小寫不敏感        Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);        Matcher m = p.matcher("java Java jAva ILoveJavA youHateJAVA adsdsfd");        //存放字串        StringBuffer  buf = new StringBuffer();        //計數奇偶數        int i  = 0;        while(m.find()){            i++;            if(i%2 == 0){                m.appendReplacement(buf, "java");            }else{                m.appendReplacement(buf, "JAVA");            }        }        //不加這句話,字串adsdsfd將會被遺棄        m.appendTail(buf);        p(buf);

結果列印:

JAVA java JAVA ILovejava youHateJAVA adsdsfd

分組

 

        //group分組,用()分組        Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})");        String s = "123aa-34345bb-234cc-00";        Matcher m = p.matcher(s);        p(m.groupCount());//2組        while(m.find()){            p(m.group());//數字字母都有            //p(m.group(1));//只有數字            //p(m.group(2));//只有字母        }

 

 

二、Regex簡單使用

 

javaRegex應用

 

JavaRegex入門1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.