正則表達式(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\.142. 過度複雜
如果正則表達式太複雜,考慮拆成多個步驟或用程式碼處理。
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);學習建議
- 從簡單開始:先掌握 \d、\w、+、* 這些基礎
- 多練習:用 regex101.com 做題目
- 查表:不需要背,用到再查
- 不要過度使用:簡單的字串操作用內建方法就好
結語
正則表達式就像一把瑞士刀:學會了,很多問題迎刃而解。
記住這句經典名言:
有些人遇到問題時想:「我知道,我用正則表達式解決。」然後他就有了兩個問題。
正則很強大,但不是萬能的。適當使用,它會是你最好的朋友。