前言:為什麼全棧工程師必須掌握 Regex?
想像一下,你在一個擁有十萬行程式碼的專案中,要找出所有「格式錯誤的 Email」;或是你在伺服器日誌中,要秒查出所有來自特定 IP 的「404 錯誤」。如果你只會用傳統的 Ctrl+F,那你可能要加班到天亮。
這就是 **正規表達式(Regular Expression,簡稱 Regex)** 登場的時刻。它就像是工程師的「魔法搜尋鍵」,能讓你用極簡的代碼描述複雜的文字特徵。
後端 Python
資料清理、爬蟲提取、日誌解析
維運 Shell
Log 分析、批量檔案更名、系統監控
前端 React
表單即時驗證、動態路由匹配
第一階段:從零開始的原子組件
Regex 的本質是「模式匹配」。我們可以把 Regex 看作是由一些**元字符 (Metacharacters)** 組成的積木。
| 類別 | 元字符 | 解釋 |
|---|---|---|
| 字元匹配 | . / \d / \w | 萬用字元 / 數字 / 英數字元 |
| 量詞 | * / + / ? | 0次以上 / 1次以上 / 0或1次 |
| 精確量詞 | {n,m} | 重複 n 到 m 次 |
| 邊界錨點 | ^ / $ | 開頭 / 結尾 |
**生活化比喻:** \d{4} 就像是在說「給我找連續四個數字」。它能匹配「2026」,但匹配不到「Joseph」。
第二階段:實戰演練 ── Python 篇
在 Python 中,我們使用內建的 re 模組。最常用的三個武器分別是:
re.search(): 找第一個匹配。re.findall(): 找所有匹配(最常用於爬蟲)。re.sub(): 替換文字(用於資料清洗)。
實戰範例:提取台灣手機號碼
import re
raw_data = "我的電話是 0912-345-678,他的則是 0988 123 456"
# 模式拆解:
# 09 -> 以 09 開頭
# \d{2} -> 接著 2 位數字
# [- ]? -> 可能有 - 或 空格,或什麼都沒有
# \d{3} -> 3 位數字
# [- ]? -> 同上
# \d{3} -> 最後 3 位數字
phone_pattern = r"09\d{2}[- ]?\d{3}[- ]?\d{3}"
results = re.findall(phone_pattern, raw_data)
print(results) # 輸出: ['0912-345-678', '0988 123 456']第三階段:實戰演練 ── Shell 篇
如果你是在伺服器環境(macOS Zsh 或 Linux Bash),最常組合使用的指令就是 grep -E。其中 -E 代表 Extended Regex,能支援更豐富的符號。
場景:從 Log 檔案中秒查所有 404 錯誤
# 搜尋當前目錄下所有 .log 檔案中含有 "ERROR" 且狀態碼為 "404" 的行數
grep -E "ERROR.*404" server.log
# 如果你想統計到底有多少次
grep -E "ERROR.*404" server.log | wc -l這裡的 .* 意思是「匹配任意長度的任意字元」,它是 Regex 中最強大的黏合劑。
Regex 邏輯小挑戰
看完上面的範例,你現在有信心寫出第一個 Regex 嗎?
任務:請寫出一個能同時匹配 'cat'、'bat' 但排除 'hat' 的 Regex。
提示:可以使用字元集合 [...] 來限定開頭。
這類邏輯非常適合在前端用 **React** 實作成一個互動式的「Regex 闖關遊戲」。玩家輸入 Regex,系統即時驗證是否正確匹配目標單字。想知道怎麼實作嗎?
總結與全棧下一步
Regex 不是用來死背的,而是用來**拆解特徵**的。掌握了基礎元字符,你就能在不同語言間游刃有餘。
**下一篇預告:** 我們將把 Regex 帶回瀏覽器,看看如何結合 **React Hook Form** 進行高效的表單即時驗證,以及在 **Next.js** 路由中進行複雜的路徑匹配。

