tomai
登入

Regex 手冊:真正會反覆使用的模式

正則表達式把一整套搜尋語言壓縮進一行,所以在各個部件豁然開朗之前,總覺得晦澀難懂。本手冊只覆蓋 20% 的語法,解決 80% 的實際任務:從貼上文字裡找電子郵件、校驗輸入、拆分日誌、批次重新命名檔案。

1. 字面量、點號與字元類別

大多數字元匹配自身,點號匹配除換行外的任意字元。方括號定義一個集合——[0-9] 匹配任意數字,[^0-9] 匹配除數字外的任意內容——而 \d\w\s 等簡寫分別覆蓋數字、單字字元和空白。只要知道這個位置該出現什麼,就優先用明確的字元類別,而不是裸點號。

2. 錨點與量詞

^ 鎖定開頭,$ 鎖定結尾,所以 ^hi 只匹配以 hi 開頭的字串。+ 表示一次或多次,* 表示零次或多次,? 表示可選;在它們後面再加一個 ? 會切換為懶惰匹配,停在第一個可能的位置而不是最後一個。貪婪與懶惰的區別,是最常見的意外匹配來源。

3. 分組、分支與前後查找

圓括號負責分組並捕獲——(cat|dog)s? 匹配 cat、cats、dog 或 dogs——而 (?:…) 只分組不捕獲。\d+(?=px) 這類前查找會檢查後面的內容但不消耗它,因此可以要求一個後綴,同時把它留在原地供下一次匹配使用。命名分組能讓下一個讀到這個模式的人一眼看懂意圖。

4. 旗標改變一切

結束斜線後面的字母會調整引擎行為:g 找出全部匹配而不是第一個,i 忽略大小寫,m 讓錨點按行生效,s 讓點號跨過換行,u 啟用完整 Unicode,y 把匹配固定在指定位置。很多看起來正確的模式返回空結果,原因都是旗標組合不對。

5. 回溯陷阱

(a+)+ 這類巢狀量詞,遇到很長又不匹配的字串時,會讓引擎走上指數級數量的路徑,直接凍住整個分頁。保持重複結構扁平,在支援的環境裡改寫成佔有式量詞或原子組,上線前先用惡意輸入測一遍可疑模式——貼進 our regex tester,每個匹配和分組都會在瀏覽器裡即時醒目顯示。