Regex Mastery
Software Engineering Foundations EP.04

Python 與 Shell
正規表達式 (Regex) 完全指南

從零開始的字串魔法:全棧工程師的萬用搜尋鍵

May 15, 2026
Back to Blog
Core Foundation
8 min read

前言:為什麼全棧工程師必須掌握 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** 路由中進行複雜的路徑匹配。


Joseph Chen

關於作者:陳憲億 Joseph Chen

軟體工程師,專注於 AI 應用與自動化系統開發。致力於將複雜的技術知識轉化為任何人都能讀懂的實戰指南。

Follow on GitHub