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));
}