為什麼「從範例出發」是另一種工具
搜尋 regex generator,第一頁是解說文章、速查表與「人看得懂」的轉譯器。它們都假設你已經知道自己要什麼樣式,只是需要有人幫你寫出來。真正難的時刻更早:你手上有一堆應該命中的字串——日誌 ID、工單編號、試算表裡的某一欄——你要的是樣式,不是一堂課。
那個時刻有個陷阱,而這個工具就是為了避開它而設計:看起來合理的樣式,往往會命中你根本沒打算命中的東西。因此這裡的每個候選在提出之前,都會先回頭跑過你自己的文字,而排序會說明哪些精確重現了你的範例、哪些又衝過了頭:
- 先驗證,才提出。 每個候選都會拿你貼上的文字實際執行,並與你範例出現的次數比對。只有命中集合正好等於你範例的候選會排在最前面;其餘的會標出多產生了幾個命中——而且一定有一個保守的「把每筆範例當成跳脫後的字面值、以 | 串接」候選,作為保證正確的下限。
- 共通的部位保留字面值。 你的範例共有的開頭與結尾會原樣跳脫——過度命中通常就是從那裡來的——只有變動的中段會被一般化成 \d+、\w+、[0-9a-fA-F]+ 或 \s+。
- 常見目標的形狀庫。 當整筆範例一看就知道是電子郵件地址、URL、UUID、IPv4 位址、ISO 日期、時間、十六進位色碼、語意化版本或 JWT 時,就會改用形狀庫裡的樣式,而不是一串 \w+。
- 測試步驟就在同一個畫面上。 命中數對上期望數、每一個命中都在你自己的文字裡標亮、完全沒有命中的片段,以及樣式每一段從哪裡來的逐段說明。由你決定哪個候選夠好,也能在它進到你的程式碼之前先檢查。
全部都在你的瀏覽器裡計算:不上傳、也沒有分享連結。候選只使用 JavaScript、Python、PCRE 與 RE2 共通的語法——沒有反向參照,也沒有環視——因此同一個樣式貼到哪裡,行為都一樣;如果你自己改出災難性回溯的風險,工具也不會替你藏起來。請把產出當成審閱的起點,而不是規格:它歸納的是你範例的形狀,從來不是它們的意義。