自 JDK 1.4 起,java.util.regex 套件正式納入標準庫,提供完整的正則表達式支持。連 String 類的 split() 與 replaceAll() 方法底層也委託給此套件實現。掌握 Pattern 與 Matcher 兩大核心類,能輕鬆解決字串匹配、查找、替換與分割等高頻需求。
Pattern.compile(regex) 靜態工廠方法獲取實例。pattern.matcher(input) 產生。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 首尾隱式加上 ^ 和 $。
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 保留,後續匹配段被替換)
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 可實現高亮顯示、條件替換等複雜邏輯。
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.compile() 提取到循環外,避免重複編譯開銷。Pattern.compile("""\d{4}-\d{2}-\d{2}""") 避免雙重轉義困擾。(?:...):不需回溯引用時使用,提升效能。(a+)+),對長輸入可能導致效能指數級下降。java.util.regex 以極簡 API 提供了工業級字串處理能力。理解 Pattern 不變性與 Matcher 狀態機本質,配合 find() 迭代與 appendReplacement/Tail 協作模式,即可優雅解決 90% 以上的字串解析需求。實際專案中,建議將常用正則封裝為工具類常量,並編寫單元測試覆蓋邊界情況。