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

Java 正則表達式實戰指南:Pattern 與 Matcher 核心用法詳解

     編輯:Java 相關知識

引言:JDK 1.4 引入的強大工具

自 JDK 1.4 起,java.util.regex 套件正式納入標準庫,提供完整的正則表達式支持。連 String 類的 split() 與 replaceAll() 方法底層也委託給此套件實現。掌握 Pattern 與 Matcher 兩大核心類,能輕鬆解決字串匹配、查找、替換與分割等高頻需求。

核心類速覽

  • Pattern:正則表達式的編譯表示,線程安全,透過 Pattern.compile(regex) 靜態工廠方法獲取實例。
  • Matcher:針對特定輸入字串執行匹配操作的引擎,非線程安全,由 pattern.matcher(input) 產生。

四大核心操作實戰

1. 完整字串匹配 matches()

Pattern p = Pattern.compile("a*b");  // 0或多個 'a' 後接 'b'
Matcher m = p.matcher("aaaaab");
boolean result = m.matches();  // true

m = p.matcher("baaaaab");
result = m.matches();  // false(開頭是 b)

關鍵點:matches() 要求整個字串符合模式,等同於在 regex 首尾隱式加上 ^ 和 $。

2. 字串替換 replaceAll() / replaceFirst()

// 將所有 "ab" 替換為 "d"
p = Pattern.compile("ab");
m = p.matcher("aaaaab");
String replaced = m.replaceAll("d");  // "aaaaad"

// 使用貪婪量詞 "*" 替換整個匹配段
p = Pattern.compile("a*b");
m = p.matcher("aaaaab");
replaced = m.replaceAll("d");  // "d"

m = p.matcher("caaaaab");
replaced = m.replaceAll("d");  // "cd"(c 保留,後續匹配段被替換)

3. 字串查找與逐段處理 find() + appendReplacement()

String text = "one cat two cats in the yard";
p = Pattern.compile("cat");
m = p.matcher(text);
StringBuffer sb = new StringBuffer();
int count = 0;

while (m.find()) {
    m.appendReplacement(sb, "dog");  // 將每個 "cat" 替換為 "dog"
    count++;
}
m.appendTail(sb);  // 複製剩餘尾部
// 結果:"one dog two dogs in the yard"
// count = 2

進階用法:結合 appendReplacement 可實現高亮顯示、條件替換等複雜邏輯。

4. 字串分割 split()

// 按一個或多個 'a' 分割
p = Pattern.compile("a+");
String[] parts = p.split("caaaaaat");  
// 結果:["c", "t"]  (中間連續 a 被視為單一分隔符)

// 限制分割次數(limit 參數)
parts = p.split("c aa aaaa t", 0);  // limit=0 移除尾部空串
// 結果:["c", " ", " ", " t"]

// 分割空白字串
p = Pattern.compile(" +");
parts = p.split("c aa aaaa t");
// 結果:["c", "aa", "aaaa", "t"]

// 轉義特殊字符:分割 "+"
p = Pattern.compile("\\+");
parts = p.split("dsafasdfdsafsda+dsagfasdfa+sdafds");
// 正確識別字面 "+" 號

常見陷阱與最佳實踐

  • 預編譯 Pattern:在循環或高頻調用中,將 Pattern.compile() 提取到循環外,避免重複編譯開銷。
  • 善用 raw string(Java 13+):Pattern.compile("""\d{4}-\d{2}-\d{2}""") 避免雙重轉義困擾。
  • 非捕獲分組 (?:...):不需回溯引用時使用,提升效能。
  • 警惕災難性回溯:避免嵌套量詞(如 (a+)+),對長輸入可能導致效能指數級下降。

結語

java.util.regex 以極簡 API 提供了工業級字串處理能力。理解 Pattern 不變性與 Matcher 狀態機本質,配合 find() 迭代與 appendReplacement/Tail 協作模式,即可優雅解決 90% 以上的字串解析需求。實際專案中,建議將常用正則封裝為工具類常量,並編寫單元測試覆蓋邊界情況。

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