Pattern:編譯後的正則模式(不可變,線程安全)。Matcher:匹配器,對輸入序列執行匹配操作(有狀態,非線程安全)。Pattern p = Pattern.compile("f(.+?)k");
Matcher m = p.matcher("fckfkkfkf");
while (m.find()) {
System.out.println(m.group() + " || " + m.group(1));
}
Java 字符串字面量與正則引擎雙層解析:
| 目標 | 正則寫法 | Java 字符串寫法 |
|---|---|---|
字面量反斜線 \ | \\ | \\\\ |
數字 \d | \d | \\d |
換行 \n | \n | \n(單層即可) |
口訣:正則元字符轉義用雙反斜線;控制字符(\n\r\t)按 Java 字符串規則單層。
find() vs matches() vs lookingAt()| 方法 | 匹配範圍 | 起始位置 | 常用場景 |
|---|---|---|---|
find() | 子序列(部分匹配) | 上次匹配末尾 | 掃描提取所有匹配 |
matches() | 整個序列 | 開頭 | 驗證整串格式 |
lookingAt() | 前綴 | 開頭 | 檢查開頭格式 |
reset() / reset(input) 可重置匹配器復用,避免重複編譯 Pattern。
( 出現順序編號,支持巢狀。Pattern: A((B)C)(D)E
Group 0: ABCDE
Group 1: BC
Group 2: B
Group 3: C
Group 4: D
常用 API:groupCount()、group(int)、start(int)、end(int)。
^ $ \b \B \A \Z \z^/$:多行模式(Pattern.MULTILINE)下匹配行首/行尾;單行模式匹配整串首尾。\A/\Z/\z:絕對首尾,不受多行模式影響(\Z 允許末尾換行,\z 絕對末尾)。\b/\B:單詞邊界/非邊界。| 類型 | 語法 | 特點 |
|---|---|---|
| 貪婪 | * + ? {m,n} | 盡可能多匹配,回溯代價大 |
| 勉強 | *? +? ?? {m,n}? | 盡可能少匹配,常用於 HTML 標籤提取 |
| 佔有 | *+ ++ ?+ {m,n}+ | 不回溯,性能最佳但需確定模式 |
// yyyy-MM-dd | yyyy/MM/dd | yyyy.MM.dd | yyyy MM dd
String regex = "(19|20)\\d\\d([- /.])(0[1-9]|1[012])\\2(0[1-9]|[12][0-9]|3[01])";
// \\2 反向引用分隔符,保證前後一致
// 注意:僅做格式校驗,不保證日期邏輯合法(如 2/30)
\\d、\\\\、\\.。Matcher 必須 reset()。Pattern 為靜態常量,避免重複編譯開銷。Pattern.COMMENTS 模式加註釋提升可讀性。正則表達式核心難點在於「寫得出、看得懂、改得動」,建議配合 Regex101 可視化調試,逐步構建複雜模式。