前言
正則表達式是文字處理的瑞士刀。Java 的 java.util.regex 遵循 Perl 5 風格,功能強大但語法繁雜。本文系統整理核心語法、邊界匹配、貪婪/勉強/佔有量詞、分組引用、旗標等,並附實戰範例。
核心語法速查表
1. 字元與轉義
| 語法 | 說明 |
\\ | 反斜線字元(Java 字串需寫 \\\\) |
\\t \\n \\r \\f | 製表、換行、回車、換頁 |
\\xhh | 十六進位字元(2 位) |
\\uhhhh | Unicode 字元(4 位) |
\\cx | 控制字元(Ctrl+x) |
2. 字元類別
| 語法 | 說明 | 範例 |
[abc] | 簡單類別:a 或 b 或 c | [aeiou] |
[^abc] | 否定類別:非 a/b/c | [^0-9] |
[a-zA-Z] | 範圍:字母 | |
[a-d[m-p]] | 聯集:a-d 或 m-p | |
[a-z&&[def]] | 交集:d、e、f | |
[a-z&&[^bc]] | 減去:a-z 除去 b、c | |
3. 預定義字元類別(雙重轉義)
| 語法 | 等價 | 說明 |
\\d | [0-9] | 數字 |
\\D | [^0-9] | 非數字 |
\\s | [ \\t\\n\\x0B\\f\\r] | 空白字元 |
\\S | [^\\s] | 非空白 |
\\w | [a-zA-Z_0-9] | 單字字元 |
\\W | [^\\w] | 非單字字元 |
4. 邊界匹配器
| 語法 | 說明 |
^ | 行首(需 MULTILINE 模式) |
$ | 行尾(需 MULTILINE) |
\\b | 單字邊界 |
\\B | 非單字邊界 |
\\A | 輸入開頭 |
\\Z | 輸入結尾(不含最終換行) |
\\z | 輸入絕對結尾 |
5. 量詞三大模式
| 類型 | 0或1 | 0或多 | 1或多 | 恰好n | 至少n | n到m |
| 貪婪 | X? | X* | X+ | X{n} | X{n,} | X{n,m} |
| 勉強 | X?? | X*? | X+? | X{n}? | X{n,}? | X{n,m}? |
| 佔有 | X?+ | X*+ | X++ | X{n}+ | X{n,}+ | X{n,m}+ |
差異關鍵:貪婪優先吃盡再回溯;勉強逐字嘗試;佔有吃盡不回溯(效能最好但最易匹配失敗)。
6. 分組與反向引用
(X):捕獲組,編號從 1 起(左括號順序)。
\\n:引用第 n 組(如 (ab)\\1 匹配 abab)。
(?:X):非捕獲組(不佔編號、效能較好)。
7. 零寬斷言
| 語法 | 名稱 | 條件 | 範例 |
(?=X) | 正向前瞻 | 右側匹配 X | \\w+(?=\\d) 匹配數字前的單字 |
(?!X) | 負向前瞻 | 右側不匹配 X | \\w+(?!\\d) |
(?<=X) | 正向後顧 | 左側匹配 X | (?<=19)99 匹配 19 後的 99 |
(?<!X) | 負向後顧 | 左側不匹配 X | |
8. 內嵌旗標
(?i):忽略大小寫(CASE_INSENSITIVE)
(?m):多行模式(MULTILINE)
(?s):單行模式(DOTALL,點號匹配換行)
(?x):註釋模式(COMMENTS,忽略空白、支援 # 註釋)
(?-i):關閉旗標
(?i:X):區域性開啟旗標
實戰範例
// 1. 驗證 Email(簡化版)
String emailRegex = "^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$";
// 2. 提取 HTML 標籤內容(非貪婪)
String html = "Hello
World";
Pattern p = Pattern.compile("<([^>]+)>(.*?)\\1>");
Matcher m = p.matcher(html);
while (m.find()) {
System.out.println("Tag: " + m.group(1) + ", Content: " + m.group(2));
}
// 3. 密碼強度:至少 8 碼、含大小寫、數字、特殊字元
String pwdRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%]).{8,}$";
效能優化建議
- 預編譯 Pattern:
Pattern.compile(regex) 重複使用。
- 避免過度回溯:善用佔有量詞
X*+、原子組 (?>X)、具體化字元類別。
- 錨定開頭結尾:
^...$ 減少不必要嘗試。
- 非捕獲組:不需反向引用時用
(?:...)。
總結
Java 正則功能完整,掌握「字元類別、量詞模式、邊界斷言、分組引用、旗標」五大核心,配合 Pattern/Matcher API,即可應對 95% 文字解析需求。記住:可讀性優於炫技,複雜邏輯拆分多個步驟往往更清晰。
- 上一篇文章: 字串去重演算法:四種經典解法與效能分析
- 下一篇文章: 一分鐘掌握 Java 8 Lambda 表達式核心原理
Copyright ©
程式碼之家 All Rights Reserved