正則表達式從入門到放棄?其實沒那麼難!

管管
教學文章 技術分享

正則表達式(Regular Expression,簡稱 Regex)是程式設計師最愛又最怕的工具。愛它是因為它超強大,怕它是因為它看起來像這樣:

^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$

這篇文章要讓你真正搞懂正則表達式,從基礎到實用,不再看到它就頭痛。

正則表達式是什麼?

簡單說,正則表達式是一種描述字串模式的語言

比如說,你想找出一段文字裡所有的 Email 地址。你不可能一個一個去找,但你可以描述 Email 的「模式」:

  • 前面是一些字母數字
  • 中間有一個 @
  • 後面是域名

正則表達式讓你用簡潔的語法描述這種模式,然後讓電腦幫你找出所有符合的字串。

基礎語法

字面值

最簡單的正則就是直接寫你要找的字:

hello  →  匹配 "hello"

特殊字元(元字元)

符號意義例子
.任意字元(除了換行)h.t → hat, hit, hot
\d數字 [0-9]\d\d → 42, 99
\w字母數字底線 [A-Za-z0-9_]\w+ → hello_123
\s空白字元a\sb → a b
\D非數字
\W非字母數字
\S非空白

量詞

符號意義例子
*0 次或多次ab* → a, ab, abb, abbb
+1 次或多次ab+ → ab, abb, abbb
?0 次或 1 次colou?r → color, colour
{n}恰好 n 次\d{4} → 2024
{n,}至少 n 次\d{2,} → 42, 123, 9999
{n,m}n 到 m 次\d{2,4} → 42, 123, 9999

位置錨點

符號意義例子
^字串開頭^Hello → 開頭是 Hello
$字串結尾world$ → 結尾是 world
\b單詞邊界\bcat\b → 完整的 cat

字元類別

[abc]     →  a 或 b 或 c
[a-z]     →  小寫字母
[A-Z]     →  大寫字母
[0-9]     →  數字(等同 \d)
[^abc]    →  除了 a, b, c 以外的字元

分組與選擇

(abc)     →  群組,可以重複使用
a|b       →  a 或 b
(cat|dog) →  cat 或 dog

實用範例

1. 驗證 Email

^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$

拆解:

  • ^[\w.-]+ → 開頭:字母數字、點、橫線,至少一個
  • @ → 一個 @ 符號
  • [\w.-]+ → 域名
  • \. → 一個點
  • [a-zA-Z]{2,}$ → 結尾:至少兩個字母(.com, .org)

2. 驗證手機號碼(台灣)

^09\d{8}$

09 開頭,後面接 8 個數字。

3. 驗證密碼強度

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$

這個比較複雜,用了「正向先行斷言」:

  • (?=.*[a-z]) → 至少一個小寫
  • (?=.*[A-Z]) → 至少一個大寫
  • (?=.*\d) → 至少一個數字
  • [a-zA-Z\d]{8,}$ → 總長度至少 8

4. 提取 URL

https?://[\w.-]+(/[\w./-]*)?

5. 找出所有 HTML 標籤

<[^>]+>

小於符號開頭,中間不是大於符號的任意字元,大於符號結尾。

6. 移除多餘空白

\s+  →  替換成單一空格

進階技巧

非貪婪匹配

預設情況下,量詞是「貪婪」的,會盡可能匹配更多。

字串:<div>hello</div><div>world</div>

貪婪:<.*>   → <div>hello</div><div>world</div>
非貪婪:<.*?> → <div>

加上 ? 變成非貪婪,盡可能匹配更少。

捕獲群組

(\d{4})-(\d{2})-(\d{2})

匹配日期格式,並分別捕獲年、月、日。

反向引用

(\w+)\s+\1

找出重複的單詞(如 "the the")。\1 引用第一個群組捕獲的內容。

常見錯誤

1. 忘記跳脫特殊字元

// ❌ 想匹配 3.14
3.14    → 會匹配 3x14(. 是任意字元)

// ✅ 正確
3\.14

2. 過度複雜

如果正則表達式太複雜,考慮拆成多個步驟或用程式碼處理。

3. 沒考慮邊界情況

測試時要包含:空字串、超長字串、特殊字元。

工具推薦

  • regex101.com:線上測試,有即時解釋
  • regexr.com:視覺化匹配
  • ChatGPT:描述你要什麼,讓 AI 幫你寫

各語言的正則

正則表達式在不同語言中語法略有不同:

// JavaScript
const regex = /\d+/g;
"abc123def456".match(regex);  // ["123", "456"]

// Python
import re
re.findall(r"\d+", "abc123def456")  # ["123", "456"]

// PHP
preg_match_all("/\d+/", "abc123def456", $matches);

學習建議

  1. 從簡單開始:先掌握 \d、\w、+、* 這些基礎
  2. 多練習:用 regex101.com 做題目
  3. 查表:不需要背,用到再查
  4. 不要過度使用:簡單的字串操作用內建方法就好

結語

正則表達式就像一把瑞士刀:學會了,很多問題迎刃而解。

記住這句經典名言:

有些人遇到問題時想:「我知道,我用正則表達式解決。」然後他就有了兩個問題。

正則很強大,但不是萬能的。適當使用,它會是你最好的朋友。