正規表示式
💡 學習指南:正規表示式看起來像天書?其實它只是一種「描述文字模式」的迷你語言。本章帶你從零開始理解正規表示式的核心思想,學會用幾個關鍵符號解決 80% 的文字搜尋和驗證問題。
0. 你為什麼需要正規表示式?
想像以下場景:
- 從一大段日誌裡找出所有 IP 位址
- 驗證使用者輸入的電子郵件格式是否合法
- 把文字中所有的日期格式從
2024/01/15替換為2024-01-15 - 從網頁原始碼中提取所有連結
用普通字串搜尋? 你需要寫一大堆 if-else 判斷邏輯。 用正規表示式? 一行模式搞定。
1. 正規表示式入門:三分鐘上手
👇 動手試試看:輸入正規表示式,即時檢視匹配結果
Regular Expressions: Search Engine for TextPattern matching · capture groups · live preview
//
Match results3 match(es)
My phone is 13812345678, landline is 010-12345678, and email is test@example.com
#1
"13812345678"#2
"010"#3
"12345678"Try presets:
Core idea:A regular expression is a small language for describing text patterns with special symbols. It appears everywhere in search, replacement, and validation.
💡 一句話理解
正規表示式 = 用特殊符號描述「你想找什麼樣的文字」。\d 代表數字,+ 代表一個或多個,所以 \d+ 就是「一個或多個數字」。
2. 核心概念:像搭積木一樣組合
正規表示式的本質是用三類積木搭出你想要的模式:
2.1 積木一:字元類(匹配什麼字元)
| 語法 | 含意 | 範例 |
|---|---|---|
. | 任意字元 | a.c → abc, a1c, a c |
\d | 數字 [0-9] | \d\d → 42, 99 |
\w | 字母/數字/底線 | \w+ → hello, user_1 |
\s | 空白字元 | 匹配空格、Tab |
[abc] | 集合中的任意一個 | [aeiou] → 母音字母 |
[^abc] | 不在集合中的 | [^0-9] → 非數字字元 |
2.2 積木二:量詞(匹配幾次)
| 語法 | 含意 | 範例 |
|---|---|---|
* | 0 次或多次 | ab* → a, ab, abbb |
+ | 1 次或多次 | ab+ → ab, abbb(不匹配 a) |
? | 0 次或 1 次 | colou?r → color, colour |
{3} | 恰好 3 次 | \d{3} → 123 |
{2,4} | 2 到 4 次 | \d{2,4} → 12, 1234 |
2.3 積木三:位置和分組
| 語法 | 含意 | 範例 |
|---|---|---|
^ | 行首 | ^Hello → 以 Hello 開頭的行 |
$ | 行尾 | end$ → 以 end 結尾的行 |
\b | 單字邊界 | \bcat\b → cat(不匹配 catch) |
(...) | 捕獲分組 | (\d+)-(\d+) → 分別捕獲 |
a|b | 或 | cat|dog → cat 或 dog |
3. 實戰:常見驗證模式
3.1 電子郵件驗證
[\w.+-]+@[\w-]+\.[\w.]+拆解:
[\w.+-]+— 使用者名稱部分(字母數字點加號橫線)@— 字面量 @[\w-]+— 網域部分\.— 跳脫的點[\w.]+— 頂級網域
3.2 手機號驗證(中國)
1[3-9]\d{9}拆解:
1— 以 1 開頭[3-9]— 第二位是 3-9\d{9}— 後面跟 9 位數字
3.3 密碼強度檢查
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$拆解:
(?=.*[a-z])— 至少一個小寫字母(前瞻斷言)(?=.*[A-Z])— 至少一個大寫字母(?=.*\d)— 至少一個數字.{8,}— 總長度至少 8 位
4. 在程式碼中使用正規表示式
JavaScript
javascript
const text = '聯絡方式:13812345678 或 15099887766'
const regex = /1[3-9]\d{9}/g
const phones = text.match(regex)
// ['13812345678', '15099887766']
// 替換
text.replace(/\d{4}(?=\d{4}$)/, '****')
// 隱藏手機號中間四位
// 驗證
/^[\w.+-]+@[\w-]+\.[\w.]+$/.test('user@example.com')
// truePython
python
import re
text = '價格是 99 元,優惠 20 元'
numbers = re.findall(r'\d+', text)
# ['99', '20']
# 替換
re.sub(r'\d+', 'X', text)
# '價格是 X 元,優惠 X 元'
# 分組捕獲
match = re.search(r'(\d+)-(\d+)', '2024-01-15')
match.group(1) # '2024'
match.group(2) # '01'5. 貪婪 vs 懶惰:一個關鍵區別
文字: <b>hello</b> and <b>world</b>| 模式 | 匹配結果 | 說明 |
|---|---|---|
<b>.*</b> | <b>hello</b> and <b>world</b> | 貪婪:盡量多匹配 |
<b>.*?</b> | <b>hello</b> | 懶惰:盡量少匹配 |
💡 記住
預設是貪婪模式。在量詞後面加 ? 變成懶惰模式。大多數時候,你需要的是懶惰模式。
6. 總結
📚 核心要點
- 正規表示式 = 描述文字模式的迷你語言,用於搜尋、匹配、替換
- 三類積木:字元類(匹配什麼)+ 量詞(匹配幾次)+ 位置/分組
- \d \w \s 是最常用的三個字元類,覆蓋數字、單字、空白
- 不需要從零寫:常見場景都有成熟的正規表示式模式可以重複使用
- 貪婪 vs 懶惰:預設貪婪(多匹配),加
?變懶惰(少匹配)
下一步學習:
- 環境變數與 PATH - 理解系統設定
- SSH 與金鑰認證 - 安全連線遠端伺服器