天天看點

Java 正規表達式1、      基礎2、      String3、      Pattern、Matcher

Java 正規表達式

正規表達式是用來處理字元串的,常見的操作有:

l  字元串比對

l  字元串替換

l  提取資訊

1、      基礎

1.1、  字元

字元
B 指定字元B
\xhh 十六進制值為oxhh的字元
\uhhhh 十六進制為oxhhhh的Unicode字元
\t 制表符tab
\n 換行符
\r 回車
\f 換頁
\e 轉義

1.2、  字元類

字元類
. 任意字元
[abc] 包含a、b、c的任意字元
[^abc] 除了a、b、c之外的任意字元
[a-zA-Z] 從a-z或A-Z的任意字元
[abc[hij]] 等同于a|b|c|h|i|j(或操作)
[a-z&[hij]] 任意h、i、j(與操作)
\s 空白符(空格、tab、換行、回車)
\S 非空白字元[^\s]
\d 數字[0-9]
\D 非數字[^\d]
\w 詞字元[a-zA-Z0-9]
\W 非詞字元[^\w]

1.3、  邏輯操作符

邏輯操作符
XY Y在X後面
X|Y X或
(X) 捕獲組,可以在表達式中用\i來引用第i個捕獲組

1.4、  邊界比對符

邊界比對符
^ 一行的起始
$ 一行的結束
\b 詞的邊界
\B 非詞的邊界
\G 前一個比對的結束

1.5、  量詞

量詞描述了一個模式吸收輸入文本的方式:

l  貪婪型

貪婪表達式會為所有可能的模式發現盡可能多的比對

l  勉強型

用問号來指定,這個量詞會比對滿足模式所需的最少字元數

l  占有型

目前,這種類型的量詞隻在Java中可用。當正規表達式被應用于字元串時,它會産生相當多的狀态,以便在比對失敗時可以回溯;而占有的量詞并不儲存這些中間狀态,是以它可以防止回溯,可以使正規表達式執行起來更有效。

量詞
貪婪型 勉強型 占有型 如何比對
X? X?? X?+ 一個或零個
X* X*? X*+ 零個或多個
X+ X+? X++ 一個或多個X
X{n} X{n}? X{n}+ 恰好n次X
X{n,} X{n,}? X{n,}+ 至少n次X
X{n,m} X{n,m}? X{n,m}+ 至少n次X,不超過m次

2、      String

String類提供了有限的正規表達式比對,如matchs、replace、split等。

3、      Pattern、Matcher

一般來說。比起有限的String類,我們更願意構造功能更強大的正規表達式對象,步驟如下:

1)     使用Pattern.compile方法先編譯正規表達式會生成Pattern執行個體;

2)     将要檢索的字元串傳入Pattern執行個體的matcher方法,會傳回一個Matcher執行個體;

3)     Matcher執行個體有很多方法可用,如matches、replace、find等;

        //先将一個正規表達式編譯為Pattern來提高效率

      Pattern pattern=Pattern.compile("\\d{4}");

      //通過mather可以擷取大量有用的資訊

      Matcher matcher=pattern.matcher("2222-3333");

      //System.out.println(matcher.matches());

      //将查找的指針重置,回到起始位置

      //matcher.reset();

      //順序比對相應的字元串

      //System.out.println(matcher.find());

      //每進行一次find,就可以将比對的字元串通過group擷取

      while (matcher.find())

      {

         //起始位置、結束位置

      System.out.println("["+matcher.start()+","+matcher.end()+"]");

         System.out.println(matcher.group());

   }

4)     可以使用括号對元素進行分組,如下

        String str="410425199008261234,410425199503266543";

       Pattern   pattern=Pattern.compile("(\\d{6})(\\d{8})(\\d{4})");

       Matchermatcher=pattern.matcher(str);

       while (matcher.find())

      {

          //下标從1開始

          System.out.println(matcher.group(1));

          System.out.println(matcher.group(2));

          System.out.println(matcher.group(3));

}