前言
正則表達式是文本處理的利器,本文整理 Java 正則最常用的符號分類、預定義字符類、邊界匹配器、貪婪量詞,配合圖解與示例,建立快速查閱的知識地圖。
一、字符類
| 語法 | 說明 | 示例匹配 |
[abc] | 簡單類:a 或 b 或 c | a, b, c |
[^abc] | 否定類:除 a/b/c 以外任意字符 | d, 1, @ |
[a-zA-Z] | 範圍類:a-z 或 A-Z(含邊界) | a, Z, m |
[a-d[m-p]] | 並集:a-d 或 m-p → [a-dm-p] | a, c, m, p |
[a-z&&[def]] | 交集:a-z 且 def → d, e, f | d, e, f |
[a-z&&[^bc]] | 減去:a-z 扣除 b,c → a, d-z | a, d, z |
[a-z&&[^m-p]] | 減去:a-z 扣除 m-p → a-l, q-z | a, l, q |
二、預定義字符類
| 符號 | 等價類 | 說明 |
. | [^\n](預設) | 任意字符(除換行,DOTALL 模式含換行) |
\d | [0-9] | 數字 |
\D | [^0-9] | 非數字 |
\s | [ \t\n\x0B\f\r] | 空白字符:空格、製表、換行、垂直製表、換頁、回車 |
\S | [^\s] | 非空白字符 |
\w | [a-zA-Z_0-9] | 單詞字符:字母、數字、下劃線 |
\W | [^\w] | 非單詞字符 |
三、邊界匹配器
| 符號 | 含義 | 示例 |
^ | 行首(MULTILINE 模式下為每行首) | ^Hello 匹配以 Hello 開頭的行 |
$ | 行尾(MULTILINE 模式下為每行尾) | World$ 匹配以 World 結尾的行 |
\b | 單詞邊界(\w 與 \W 交界) | \bcat\b 匹配單詞 cat,不匹配 catfish |
\B | 非單詞邊界 | \Bcat\B 匹配 catfish 中的 cat |
四、貪婪量詞
| 語法 | 含義 | 示例 |
X? | 0 或 1 次 | ab?c 匹配 ac 或 abc |
X* | 0 次或多次(≥0) | ab*c 匹配 ac, abc, abbc... |
X+ | 1 次或多次(≥1) | ab+c 匹配 abc, abbc... |
X{n} | 恰好 n 次 | \d{3} 匹配 3 位數字 |
X{n,} | 至少 n 次 | \d{2,} 匹配 ≥2 位數字 |
X{n,m} | n 到 m 次(n ≤ m) | \d{3,5} 匹配 3~5 位數字 |
量詞預設為貪婪模式(盡可能多匹配),後加 ? 變為勉強模式(如 *?、+?),後加 + 變為佔有模式(如 *+、不回溯)。
五、常用元字符速查與示例
| 字符 | 說明 | 示例 |
. | 任意字符(除換行) | r.t 匹配 rat, rut, r t,不匹配 root |
$ | 行尾 | weasel$ 匹配 "He's a weasel" 結尾 |
^ | 行首 | ^When in 匹配 "When in the" 開頭 |
\ | 轉義元字符 | \$ 匹配 $ 符號,\. 匹配字面點號 |
| | 邏輯或 | him|her 匹配 him 或 her |
+ | ≥1 次 | 9+ 匹配 9, 99, 999... |
? | 0 或 1 次 | ab?c 匹配 ac 或 abc |
{i} / {i,j} | 固定/範圍次數 | A[0-9]{3} 匹配 A+3位數字;[0-9]{4,6} 匹配 4~6 位數字 |
六、分組符號辨析:() vs [] vs {}
| 符號 | 核心作用 | 典型示例 |
() | 捕獲分組,供反向引用 \\1、替換 $1、提取 group(1);將子表達式作為整體量化 | (ab)+ 匹配 abab;(\d{3})-\\1 匹配 123-123 |
[] | 字符類,定義單字符可選集合/範圍 | [a-z] 匹配任意小寫字母 |
{} | 量詞,指定前面原子(字符/分組/字符類)重複次數 | \s{3} 3 個空格;\d{1,3} 1~3 位數字 |
易混淆對照:
(0-9) 匹配字面字符串 "0-9"。
[0-9] 匹配任意一個數字字符。
[0-9]* 匹配 0~n 個數字(可空)。
[0-9]+ 匹配 1~n 個數字(非空)。
{1-9} 語法錯誤,正確 {1,9}。
[0-9]{0,9} 匹配長度 0~9 的純數字字符串。
七、Pattern 編譯標誌
Pattern.CASE_INSENSITIVE ((?i)):忽略大小寫。
Pattern.MULTILINE ((?m)):^/$ 匹配每行首尾。
Pattern.DOTALL ((?s)):. 匹配含換行符。
Pattern.COMMENTS ((?x)):忽略空白與註釋,可寫多行可讀正則。
Pattern.UNICODE_CASE ((?u)):Unicode 感知大小寫折疊。
總結
熟記上述符號分類與預定義類,配合量詞與邊界匹配器,即可構建 80% 以上的實用正則。下一步建議實戰:Pattern.compile() 編譯 → matcher() 獲取匹配器 → find()/matches() 執行匹配 → group()/start()/end() 提取信息。後續將推出《四大核心操作實戰》與《進階技巧:零寬斷言、佔有模式、性能優化》敬請期待。