在軟體開發與資料處理的日常中,字串解析(String Parsing)幾乎是無法避免的任務。無論是表單格式驗證(Email、電話、身分證)、Log 記錄中的關鍵欄位擷取,還是敏感資訊過濾,正規表達式(Regular Expression, 簡稱 Regex)都是最強大的工具。
然而,Regex 也是許多工程師心中「寫的時候頭痛,維護時更頭痛」的黑魔法。稍不注意漏掉跳脫字元、貪婪模式(Greedy Matching)失控,甚至可能引發災難性的 ReDoS(正規表達式拒絕服務攻擊)。
今天我們就來示範:如何讓 ChatGPT 成為你的 Regex 專家,用自然語言描述需求,一鍵生成精準的正規表達式、捕獲群組(Capturing Groups)與完整的單元測試!
想要讓 AI 生成既精準又具備防禦性的 Regex,不要只說「幫我寫驗證 Email 的 Regex」,而是要明確列出「合法範例」與「非法範例」:
【Regex 生成提示詞範本】
請扮演字串解析與資安專家。我需要針對以下業務需求設計一段 Java 相容的正規表達式(Regex):
[描述需求,例如:解析伺服器 Access Log]
請提供以下四項內容:
假設我們要從格式繁雜的伺服器 Log 中,擷取「IP 位址」、「請求時間」、「HTTP 方法」、「API 路徑」與「HTTP 狀態碼」:
[範例 Log 內容]
192.168.1.100 - [14/Oct/2026:15:23:45 +0800] "GET /api/v1/orders?id=123 HTTP/1.1" 200 1024
透過 AI 分析後,它會推薦使用「具名捕獲群組(Named Capturing Groups)」,這能讓 Java 代碼的可讀性大幅提升,不用再去死記 matcher.group(1)、group(2) 是什麼欄位:
[Java Regex 命名捕獲範例]
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LogParserDemo {
// 預先編譯 Pattern,避免重複呼叫浪費 CPU 效能
private static final String LOG_REGEX =
"^(?<ip>\\S+) - \\[(?<time>[^\\]]+)\\] \"(?<method>[A-Z]+) (?<path>\\S+) [^\"]+\" (?<status>\\d{3})";
private static final Pattern PATTERN = Pattern.compile(LOG_REGEX);
public static void main(String[] args) {
String logLine = "192.168.1.100 - [14/Oct/2026:15:23:45 +0800] \"GET /api/v1/orders?id=123 HTTP/1.1\" 200 1024";
Matcher matcher = PATTERN.matcher(logLine);
if (matcher.find()) {
System.out.println("Client IP : " + matcher.group("ip"));
System.out.println("Timestamp : " + matcher.group("time"));
System.out.println("HTTP Method: " + matcher.group("method"));
System.out.println("Endpoint : " + matcher.group("path"));
System.out.println("Status : " + matcher.group("status"));
} else {
System.out.println("Log 格式不符合規範!");
}
}
}
AI 在分析時指出了兩個至關重要的實務細節:
str.matches(regex)。matches() 每次呼叫底層都會重新執行一次 Pattern.compile(),造成龐大開銷。正確做法是將其抽成 private static final Pattern。(a+)+ 或貪婪的 .* 搭配模糊結尾)時,惡意使用者只要傳入一段特定長度的無效字串,就會導致 Regex 引擎陷入指數級別的回溯比對,瞬間吃滿 100% CPU。[^\\]]+ 代替 .*),能有效切斷不必要的回溯路徑。今天我們掌握了利用 AI 設計複雜正規表達式的方法:透過具名捕獲群組提升程式碼可讀性、預編譯 Pattern 節省效能,並學會了避免災難性回溯的資安意識。