正則引擎預設採用貪婪匹配:數量詞(* + ? {n,m})會盡可能多地匹配字元,直到無法匹配為止,再透過回溯逐步縮減以滿足整體模式。
// 字串:"1023000" "1023000".match(/(\d+)(0*)/); // ["1023000", "1023000", ""] 貪婪:\d+ 吞噬所有數字 "1023000".match(/(\d+?)(0*)/); // ["1023000", "1023", "000"] 非貪婪:\d+? 只匹配必要部分
String str = "aaa\"bbb\"ccc\"ddd\"eee";
// 貪婪模式:\".*\" → 匹配從第一個雙引號到最後一個雙引號
str.replaceAll("\"(.*)\"", "@"); // 結果:aaa@eee
// 非貪婪模式:\".*?\" → 匹配最近的雙引號對
str.replaceAll("\"(.*?)\"", "@"); // 結果:aaa@ccc@eee
模式 (a+)+b 匹配 aaaaaaaaaaaaac 會觸發指數級回溯(ReDoS),導致 CPU 飆升。防範措施:
{n,m})。*+ ++ ?+,Java 不直接支援,可用原子組 (?>...))。*? +? ??),除非確定需要貪婪語義。[^"]* 替代 .*? 匹配引號內容,效率更高且無回溯。^...$ 減少不必要嘗試。貪婪模式匹配最長、非貪婪匹配最短,理解回溯機制是寫出高效、正確正則的關鍵。實戰中「具體化模式」優於「依賴貪婪/非貪婪」。