正則表達式(regular expression)用於指定字元串的模式,可以在任何需要定位匹配某種特定模式的字元串的情況下使用正則表達式,正則表達式的語法如下: 語法解釋字元c表示字元 c\unnnn,\xnn,\0n,\0nn,\0nnn具有給定十六進位或者十進位值的碼元\t,\n,\r,\f,\... ...
正則表達式(regular expression)用於指定字元串的模式,可以在任何需要定位匹配某種特定模式的字元串的情況下使用正則表達式,正則表達式的語法如下:
語法 | 解釋 |
字元 |
|
c | 表示字元 c |
\unnnn,\xnn,\0n,\0nn,\0nnn | 具有給定十六進位或者十進位值的碼元 |
\t,\n,\r,\f,\a | 控制符:製表符、換行符、回車符、換頁符、警告符 |
字元類 |
|
[C1,C2,…] | 任何由C1、C2,…表示的字元,其中C1可以表示多個字元,字元範圍C1-C2或者字元類 |
[^…] | 排除匹配,^之後的字元不能匹配 |
[… && …] | 二個字元集的交集 |
預定義字元類 |
|
. | 除了行終止符之外的所有字元(在 DOTALL 標誌被設置時,則表示所有字元) |
\d | 一個數字,等價 [0-9] |
\D | 一個非數字,等價[^0-9] |
\s | 一個空白字元[\t\n\r\f\x0B] |
\S | 一個非空白字元 |
\w | 一個詞語字元[a-zA-Z0-9_] |
\W | 一個非詞語字元 |
\p{name} | 一個命名字元類,命名字元參考命名字元表 |
\P{name} | 一個命名字元類的補集 |
邊界匹配符 |
|
^ $ | 表示輸入的開頭和結尾(或者在多行模式下行的開頭和結尾) |
\b | 一個詞語邊界 |
\B | 一個非詞語邊界 |
\A | 輸入的開頭 |
\z | 輸入的結尾 |
\Z | 除了行終止符之外的輸入結尾 |
\G | 前一個匹配的結尾 |
量詞 |
|
X? | 可選的X |
X* | X重覆0次或多次 |
X+ | X重覆1次或多次 |
X{n} X{n,} X{n,m} | X重覆n次,至少n次,在n到m次之間 |
量詞尾碼 |
|
? | 在預設(貪婪)匹配轉變為勉強匹配 |
+ | 在預設(貪婪)匹配轉變為占用匹配 |
集合操作 |
|
XY | 在任何X中的字元串,後面跟隨任何Y中的字元串 |
X|Y | 任何X或Y中的字元串 |
群組 |
|
(X) | 將X做為群組 |
\n | 第 n 個群組的匹配 |
匹配標誌:
- CASE_INSENSITIVE:匹配字元時不區分字母的大小寫,預設情況下,這個標誌只考慮US ASCII 字元
- UNICODE_CASE:當與CASE_INSENSITIVE組合時,用Unicode字母的大小寫來匹配
- MULTILINE:^ 和 $ 匹配行的開頭和結尾,而不是整個輸入的開頭和結尾
- UNIX_LINUX:在多行模式中匹配 ^ 和 $ 時,只有 '\n' 被識別成行終止符
- DOTALL:當使用整個標誌時,. 符號匹配所有字元,包含行終止符
示例代碼:
- 字元串匹配:
Pattern pattern = Pattern.compile("^[a-zA-Z0-9]+$");
String testString = "sdlfkjsdkfj342349898LKJKJ";
Matcher matcher = pattern.matcher(testString);
System.out.println("testString=" + testString + " pattern=" + pattern.pattern() + " matcher " + matcher.matches());
System.out.println("-----------------------------------------------------------");
- 排除匹配:
pattern = Pattern.compile("[^89]+");
testString = "1234567890";
matcher = pattern.matcher(testString);
System.out.println("testString=" + testString + " pattern=" + pattern.pattern() + " matcher " + matcher.matches());
testString = "1234567";
matcher = pattern.matcher(testString);
System.out.println("testString=" + testString + " pattern=" + pattern.pattern() + " matcher " + matcher.matches()
+" string "+ matcher.group());
System.out.println("-----------------------------------------------------------");
- 群組匹配:
pattern = Pattern.compile("([a-zA-Z0-9]+):([0-9]+)");
testString = "a000001:330,a0000002:440,a0000004:445";
matcher = pattern.matcher(testString);
while (matcher.find()) {
System.out.println("group 0 value " + matcher.group(0) + " start " + matcher.start(0) + " end " + matcher.end(0));
System.out.println("group 1 value " + matcher.group(1) + " start " + matcher.start(1) + " end " + matcher.end(1));
System.out.println("group 2 value " + matcher.group(2) + " start " + matcher.start(2) + " end " + matcher.end(2));
System.out.println("-----------------------------------------------------------");
}
- 匹配替換字元串:
pattern = Pattern.compile("[ab]+");
testString = "abcdefghijkmul";
matcher = pattern.matcher(testString);
String output = matcher.replaceAll("8");
System.out.println("pattern " + pattern.pattern() + " input string " + testString + " replace " + output);
output = matcher.replaceAll(Matcher.quoteReplacement("$"));
System.out.println("pattern " + pattern.pattern() + " input string " + testString + " replace " + output);
output = matcher.replaceAll("\\$");
System.out.println("pattern " + pattern.pattern() + " input string " + testString + " replace " + output);
System.out.println("-----------------------------------------------------------");
- 匹配分隔字元串:
pattern = Pattern.compile(",");
testString = "a000001:330,a0000002:440,a0000004:445";
String[] tokens = pattern.split(testString);
for (int i = 0; i < tokens.length; i++) {
System.out.println("pattern " + pattern.pattern() + " testString " + testString + " split " + tokens[i]);
}
System.out.println("-----------------------------------------------------------");