掌握 Java 正則表達式優化技巧,包含非捕獲分組減少記憶體開銷、利用引擎自動優化、調整貪婪與勉強模式以提升匹配效能。
1. 使用非捕獲分組
若不需擷取分組內容,請用 (?:X) 取代 (X),避免儲存匹配文本的額外開銷。
2. 讓引擎完成優化
- 必要字串預檢:若正則包含必須出現的固定字串,引擎會優先搜尋該字串,找不到即直接失敗,不再評估完整表達式。
- 長度預檢:如
\d{100} 會先檢查輸入長度是否為 100,不足則直接失敗。
- 寫法建議:不要將固定字串藏在分組或選擇分支中,讓引擎易於識別;盡可能指定預期輸入長度。
3. 優化貪婪與勉強模式
- 貪婪模式 (
*, +):優先匹配最多字元,若後續失敗則回溯 (backtrack) 吐出字元。
- 勉強模式 (
*?, +?):優先匹配最少字元,逐步擴展直到整體匹配成功。
- 選擇策略:若預期匹配內容較短,勉強模式可減少回溯;若預期匹配大部分輸入,貪婪模式較快。實測為準。
實務建議
- 優先使用非捕獲分組。
- 將固定前綴/關鍵字提至正則開頭。
- 善用具體量詞 (如
{3,5}) 替代通用 */+。
- 對複雜正則進行基準測試,觀察回溯次數。