首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 正則表達式易錯知識點總結與實戰技巧

     編輯:Java 相關知識

核心類回顧

  • Pattern:編譯後的正則模式(不可變,線程安全)。
  • Matcher:匹配器,對輸入序列執行匹配操作(有狀態,非線程安全)。
Pattern p = Pattern.compile("f(.+?)k");
Matcher m = p.matcher("fckfkkfkf");
while (m.find()) {
    System.out.println(m.group() + " || " + m.group(1));
}

五大易混淆核心點

1. 反斜線雙重轉義陷阱

Java 字符串字面量與正則引擎雙層解析:

目標正則寫法Java 字符串寫法
字面量反斜線 \\\\\\\
數字 \d\d\\d
換行 \n\n\n(單層即可)

口訣:正則元字符轉義用雙反斜線;控制字符(\n\r\t)按 Java 字符串規則單層。

2. find() vs matches() vs lookingAt()

方法匹配範圍起始位置常用場景
find()子序列(部分匹配)上次匹配末尾掃描提取所有匹配
matches()整個序列開頭驗證整串格式
lookingAt()前綴開頭檢查開頭格式

reset() / reset(input) 可重置匹配器復用,避免重複編譯 Pattern。

3. 組(Group)編號規則

  • 組 0:整個模式。
  • 組 1~N:按左括號 ( 出現順序編號,支持巢狀。
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)。

4. 邊界控制:^ $ \b \B \A \Z \z

  • ^/$:多行模式(Pattern.MULTILINE)下匹配行首/行尾;單行模式匹配整串首尾。
  • \A/\Z/\z:絕對首尾,不受多行模式影響(\Z 允許末尾換行,\z 絕對末尾)。
  • \b/\B:單詞邊界/非邊界。

5. 貪婪/勉強/佔有量詞

類型語法特點
貪婪* + ? {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)

避坑清單

  1. 雙重轉義:\\d、\\\\、\\.。
  2. 復用 Matcher 必須 reset()。
  3. 組編號從 1 起,巢狀按左括號序。
  4. 預編譯 Pattern 為靜態常量,避免重複編譯開銷。
  5. 複雜正則優先用 Pattern.COMMENTS 模式加註釋提升可讀性。

正則表達式核心難點在於「寫得出、看得懂、改得動」,建議配合 Regex101 可視化調試,逐步構建複雜模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved