字元與字元類
| 語法 | 說明 |
x | 字元 x |
\\ | 反斜線字元(Java 字串寫 \\\\) |
\0n \0nn \0mnn | 八進位值字元 |
\xhh | 十六進位值字元 (0xhh) |
\uhhhh | Unicode 字元 (0xhhhh) |
\t \n \r \f \a \e | 製表、換行、回車、換頁、響鈴、Escape |
\cx | Control-x (Ctrl+字元) |
[abc] | 簡單字元類:a 或 b 或 c |
[^abc] | 否定字元類:非 a/b/c |
[a-zA-Z] | 範圍:a-z 或 A-Z |
[a-d[m-p]] | 聯集:a-d 或 m-p |
[a-z&&[def]] | 交集:d、e、f |
[a-z&&[^bc]] | 減去:a-z 除去 b、c |
預定義字元類(Java 字串雙重轉義)
| 語法 | 等價字元類 | Java 字串寫法 |
. | 任意字元(可能不含行結束符) | "." |
\d | 數字 [0-9] | "\\d" |
\D | 非數字 [^0-9] | "\\D" |
\s | 空白 [ \t\n\x0B\f\r] | "\\s" |
\S | 非空白 | "\\S" |
\w | 單詞字元 [a-zA-Z_0-9] | "\\w" |
\W | 非單詞字元 | "\\W" |
POSIX 字元類(僅 US-ASCII)
| 語法 | 含義 |
\p{Lower} | 小寫字母 [a-z] |
\p{Upper} | 大寫字母 [A-Z] |
\p{ASCII} | 所有 ASCII [\x00-\x7F] |
\p{Alpha} | 字母 [\p{Lower}\p{Upper}] |
\p{Digit} | 數字 [0-9] |
\p{Alnum} | 字母數字 [\p{Alpha}\p{Digit}] |
\p{Punct} | 標點符號 |
\p{Graph} | 可見字元 [\p{Alnum}\p{Punct}] |
\p{Print} | 可列印字元 [\p{Graph}\x20] |
\p{Blank} | 空格或製表 [ \t] |
\p{Cntrl} | 控制字元 [\x00-\x1F\x7F] |
\p{XDigit} | 十六進位數字 [0-9a-fA-F] |
\p{Space} | 空白字元 [ \t\n\x0B\f\r] |
java.lang.Character 類別屬性
| 語法 | 等價方法 |
\p{javaLowerCase} | Character.isLowerCase() |
\p{javaUpperCase} | Character.isUpperCase() |
\p{javaWhitespace} | Character.isWhitespace() |
\p{javaMirrored} | Character.isMirrored() |
Unicode 區塊與類別
| 語法 | 說明 |
\p{InGreek} | Greek 區塊字元 |
\p{Lu} | 大寫字母類別 |
\p{Sc} | 貨幣符號 |
\P{InGreek} | 非 Greek 區塊字元(大寫 P 表否定) |
[\p{L}&&[^\p{Lu}]] | 所有字母但非大寫(減去) |
邊界匹配器
| 語法 | 說明 |
^ | 行開頭(需 Pattern.MULTILINE) |
$ | 行結尾(需 MULTILINE) |
\b | 單詞邊界 |
\B | 非單詞邊界 |
\A | 輸入開頭 |
\G | 上次匹配結尾 |
\Z | 輸入結尾(最後行結束符前) |
\z | 輸入絕對結尾 |
行結束符:\n、\r\n、\r、\u0085、\u2028、\u2029。
編譯旗標
Pattern pattern = Pattern.compile(regex,
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL | Pattern.UNICODE_CASE | Pattern.UNIX_LINES | Pattern.COMMENTS | Pattern.CANON_EQ);
| 旗標 | 效果 |
CASE_INSENSITIVE | 不分大小寫(預設僅 US-ASCII) |
UNICODE_CASE | 配合 CASE_INSENSITIVE 進行 Unicode 大小寫折疊 |
MULTILINE | ^/$ 匹配行首尾而非整個輸入 |
UNIX_LINES | 多行模式下僅 \n 視為行結束符 |
DOTALL | . 匹配含行結束符在內的所有字元 |
COMMENTS | 允許模式中空白與 # 註解 |
CANON_EQ | 考慮 Unicode 規範等價 |
數量詞
| 貪婪 | 勉強 | 佔有 | 說明 |
X? | X?? | X?+ | 0 或 1 次 |
X* | X*? | X*+ | 0 或多次 |
X+ | X+? | X++ | 1 或多次 |
X{n} | X{n}? | X{n}+ | 恰好 n 次 |
X{n,} | X{n,}? | X{n,}+ | 至少 n 次 |
X{n,m} | X{n,m}? | X{n,m}+ | n 到 m 次 |
差異:貪婪優先吃盡再回溯;勉強優先少吃再擴展;佔有吃盡不回溯(效能最佳、功能最受限)。
邏輯運算與分組
| 語法 | 說明 |
XY | X 接著 Y |
X|Y | X 或 Y |
(X) | 捕獲組(編號從 1 起,按左括號順序) |
(?:X) | 非捕獲組 |
\n | 反向引用第 n 組 |
零寬度斷言
| 語法 | 名稱 | 說明 |
(?=X) | 正向先行斷言 | 右側匹配 X 才繼續,不消耗字元 |
(?!X) | 負向先行斷言 | 右側不匹配 X 才繼續 |
(?<=X) | 正向後行斷言 | 左側匹配 X 才繼續(固定寬度) |
(?<!X) | 負向後行斷言 | 左側不匹配 X 才繼續 |
(?>X) | 獨立非捕獲組 | 不回溯(佔有性質) |
行內旗標切換
| 語法 | 效果 |
(?i) | 開啟不分大小寫 |
(?-i) | 關閉不分大小寫 |
(?m) | 開啟多行 |
(?s) | 開啟 DOTALL |
(?x) | 開啟註解模式 |
(?idmsux-idmsux:X) | 非捕獲組內局部啟用/停用旗標 |
引用與轉義
| 語法 | 說明 |
\Q...\E | 字面引用區間(內部特殊字元失效,除 \E) |
\ | 單字元轉義 |
Java 程式碼常用模式
// 編譯一次,多次複用
Pattern p = Pattern.compile("\\d{4}-\\d{2}-\\d{2}"); // 日期 yyyy-MM-dd
Matcher m = p.matcher("Today is 2024-01-15");
while (m.find()) System.out.println(m.group()); // 2024-01-15
// 分割
String[] parts = "a,b;c".split("[,;]");
// 替換
String replaced = "abc123def".replaceAll("\\d+", "#"); // abc#def
// 分組提取
Pattern p2 = Pattern.compile("(\\w+)@(\\w+\\.\\w+)");
Matcher m2 = p2.matcher("user@example.com");
if (m2.matches()) {
System.out.println(m2.group(1)); // user
System.out.println(m2.group(2)); // example.com
}