Skip to content

正規表示式

💡 學習指南:正規表示式看起來像天書?其實它只是一種「描述文字模式」的迷你語言。本章帶你從零開始理解正規表示式的核心思想,學會用幾個關鍵符號解決 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|bcat|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')
// true

Python

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. 總結

📚 核心要點

  1. 正規表示式 = 描述文字模式的迷你語言,用於搜尋、匹配、替換
  2. 三類積木:字元類(匹配什麼)+ 量詞(匹配幾次)+ 位置/分組
  3. \d \w \s 是最常用的三個字元類,覆蓋數字、單字、空白
  4. 不需要從零寫:常見場景都有成熟的正規表示式模式可以重複使用
  5. 貪婪 vs 懶惰:預設貪婪(多匹配),加 ? 變懶惰(少匹配)

下一步學習