iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0
ChatGPT & Codex

從 Prompt Engineering 到 Copilot / Codex 實務 30 天系列 第 9 篇

Day 09:【字串處理與 Regex】複雜字串解析免頭痛:讓 AI 生成正規表達式並附帶測試

  • 分享至 

  • xImage
  •  

在軟體開發與資料處理的日常中,字串解析(String Parsing)幾乎是無法避免的任務。無論是表單格式驗證(Email、電話、身分證)、Log 記錄中的關鍵欄位擷取,還是敏感資訊過濾,正規表達式(Regular Expression, 簡稱 Regex)都是最強大的工具。

然而,Regex 也是許多工程師心中「寫的時候頭痛,維護時更頭痛」的黑魔法。稍不注意漏掉跳脫字元、貪婪模式(Greedy Matching)失控,甚至可能引發災難性的 ReDoS(正規表達式拒絕服務攻擊)。

今天我們就來示範:如何讓 ChatGPT 成為你的 Regex 專家,用自然語言描述需求,一鍵生成精準的正規表達式、捕獲群組(Capturing Groups)與完整的單元測試!


一、Regex 生成的提示詞工程模板(Regex Prompting)

想要讓 AI 生成既精準又具備防禦性的 Regex,不要只說「幫我寫驗證 Email 的 Regex」,而是要明確列出「合法範例」與「非法範例」:

【Regex 生成提示詞範本】
請扮演字串解析與資安專家。我需要針對以下業務需求設計一段 Java 相容的正規表達式(Regex):
[描述需求,例如:解析伺服器 Access Log]

請提供以下四項內容:

  1. 正規表達式字串:包含純 Regex 規則與 Java 字串轉義(Escaped String)版本。
  2. 語法拆解說明:逐段解釋每個符號、量詞與捕獲群組(Named Groups)的意義。
  3. 測試矩陣(Test Cases):列出至少 3 個合法案例與 3 個邊界非法案例,說明比對結果。
  4. ReDoS 安全檢查:確認是否存在災難性回溯(Catastrophic Backtracking)的風險與防範建議。

二、實戰案例:解析 Nginx / 伺服器 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 生成的 Regex 與 Java 命名群組實作

透過 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 提醒的工程與資安把關

AI 在分析時指出了兩個至關重要的實務細節:

  1. 效能優化:預先編譯 Pattern
    • 很多初學者常在迴圈或高頻呼叫的函式中使用 str.matches(regex)。
    • 事實上 matches() 每次呼叫底層都會重新執行一次 Pattern.compile(),造成龐大開銷。正確做法是將其抽成 private static final Pattern。
  2. 防範 ReDoS 攻擊(Catastrophic Backtracking)
    • 當 Regex 中包含巢狀的量詞(如 (a+)+ 或貪婪的 .* 搭配模糊結尾)時,惡意使用者只要傳入一段特定長度的無效字串,就會導致 Regex 引擎陷入指數級別的回溯比對,瞬間吃滿 100% CPU。
    • AI 指出:在比對非空白字元時,使用具體範圍(如 [^\\]]+ 代替 .*),能有效切斷不必要的回溯路徑。

今日小結與預告

今天我們掌握了利用 AI 設計複雜正規表達式的方法:透過具名捕獲群組提升程式碼可讀性、預編譯 Pattern 節省效能,並學會了避免災難性回溯的資安意識。


上一篇
Day 08:【陣列與雙指針】用 AI 拆解經典陣列題:從暴力解一步步優化到雙指針法
下一篇
Day 10:【數學與邏輯題】以 AI 推導數論與模擬問題的底層邏輯與優化解法
系列文
從 Prompt Engineering 到 Copilot / Codex 實務 30 天 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言