正則表達式入門指南:從零開始學 Regex
什麼是正則表達式(Regular Expression)?
正則表達式(Regular Expression,簡稱 Regex 或 RegExp)是一種用於描述文字模式的特殊語法。它就像是一種「搜尋語言」,讓您能夠用簡潔的表達式來匹配、搜尋、替換複雜的文字模式。
正則表達式被廣泛應用於程式開發、數據處理、文字編輯等領域。幾乎所有主流程式語言(JavaScript、Python、Java、C# 等)都內建了正則表達式的支援。
為什麼要學正則表達式?
- 表單驗證:驗證 Email、電話號碼、身分證號等格式
- 數據提取:從大量文字中提取特定資訊
- 搜尋替換:進行複雜的文字搜尋和批量替換
- 日誌分析:從伺服器日誌中提取關鍵資訊
- 網頁爬蟲:解析 HTML 內容,提取所需數據
基礎語法:字元匹配
普通字元
最簡單的正則表達式就是普通字元,它會精確匹配對應的文字。例如,正則 hello 會匹配字串中的 "hello"。
特殊字元(元字元)
正則表達式中有一些具有特殊含義的字元:
| 元字元 | 含義 | 範例 | 匹配結果 |
|---|---|---|---|
. | 匹配任意單個字元(換行符除外) | a.c | abc, a1c, a-c |
\d | 匹配任意數字(0-9) | \d{3} | 123, 456, 789 |
\w | 匹配字母、數字或底線 | \w+ | hello, test_123 |
\s | 匹配空白字元(空格、Tab 等) | a\sb | a b |
\D | 匹配非數字字元 | \D+ | abc, hello |
\W | 匹配非字母數字字元 | \W | @, #, ! |
\S | 匹配非空白字元 | \S+ | hello, 123 |
您可以使用我們的正則表達式測試器 [blocked]即時驗證這些語法。
量詞:控制匹配次數
量詞用於指定前面的元素應該匹配多少次:
| 量詞 | 含義 | 範例 | 匹配結果 |
|---|---|---|---|
* | 匹配 0 次或多次 | ab*c | ac, abc, abbc |
+ | 匹配 1 次或多次 | ab+c | abc, abbc(不匹配 ac) |
? | 匹配 0 次或 1 次 | colou?r | color, colour |
{n} | 精確匹配 n 次 | \d{4} | 2024, 1234 |
{n,} | 匹配至少 n 次 | \d{2,} | 12, 123, 1234 |
{n,m} | 匹配 n 到 m 次 | \d{2,4} | 12, 123, 1234 |
貪婪匹配 vs 懶惰匹配
預設情況下,量詞是「貪婪」的,會盡可能多地匹配字元。在量詞後加上 ? 可以變成「懶惰」匹配,盡可能少地匹配。
例如,對於字串 <div>hello</div>:
- 貪婪匹配
<.*>→ 匹配整個<div>hello</div> - 懶惰匹配
<.*?>→ 匹配<div>和</div>
字元類別:匹配特定字元集
使用方括號 [] 可以定義一組可匹配的字元:
| 語法 | 含義 | 範例 |
|---|---|---|
[abc] | 匹配 a、b 或 c | [aeiou] 匹配母音 |
[a-z] | 匹配 a 到 z 的任意字元 | 小寫字母 |
[A-Z] | 匹配 A 到 Z 的任意字元 | 大寫字母 |
[0-9] | 匹配 0 到 9 的任意數字 | 等同於 \d |
[^abc] | 匹配除了 a、b、c 以外的字元 | 否定字元類 |
錨點:定位匹配位置
錨點不匹配字元,而是匹配位置:
| 錨點 | 含義 | 範例 | 說明 |
|---|---|---|---|
^ | 匹配字串開頭 | ^Hello | 匹配以 Hello 開頭的字串 |
$ | 匹配字串結尾 | world$ | 匹配以 world 結尾的字串 |
\b | 匹配單詞邊界 | \bcat\b | 匹配獨立的 cat,不匹配 category |
分組與捕獲
使用圓括號 () 可以將多個元素組成一個群組:
基本分組:(abc)+ 匹配一個或多個 "abc" 序列。
捕獲群組:圓括號不僅用於分組,還會「捕獲」匹配的內容,可以在後續引用。例如 (\d{4})-(\d{2})-(\d{2}) 可以分別捕獲年、月、日。
非捕獲群組:如果只需要分組而不需要捕獲,可以使用 (?:...)。
在我們的正則測試器 [blocked]中,您可以清楚地看到每個捕獲群組匹配的內容。
實用正則表達式範例
以下是一些常用的正則表達式範例,您可以直接在我們的正則測試器 [blocked]中測試:
Email 驗證
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
這個正則可以驗證基本的 Email 格式,包含用戶名、@ 符號、域名和頂級域名。
台灣手機號碼
^09\d{8}$
^09\d{8}$
匹配台灣手機號碼格式:09 開頭,後接 8 位數字。
URL 匹配
https?:\/\/[\w\-]+(\.[\w\-]+)+[\/\w\-._~:?#[\]@!$&'()*+,;=]*
https?:\/\/[\w\-]+(\.[\w\-]+)+[\/\w\-._~:?#[\]@!$&'()*+,;=]*
匹配 HTTP 和 HTTPS 網址。
台灣身分證號碼
^[A-Z][12]\d{8}$
^[A-Z][12]\d{8}$
匹配台灣身分證號碼格式:一個大寫英文字母 + 1 或 2 + 8 位數字。
IPv4 地址
^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
精確匹配 IPv4 地址,每個數字段在 0-255 之間。
常見問題(FAQ)
正則表達式在不同程式語言中是否相同?
基本語法大致相同,但不同語言可能有一些差異。例如,JavaScript 使用 /pattern/flags 語法,Python 使用 re 模組。我們的測試器使用 JavaScript 正則引擎。
如何除錯複雜的正則表達式?
建議使用我們的正則測試器 [blocked],它提供即時匹配高亮和分組捕獲顯示,幫助您逐步驗證和除錯正則表達式。
正則表達式有效能問題嗎?
是的,不當的正則表達式可能導致「災難性回溯」(Catastrophic Backtracking),嚴重影響效能。避免使用巢狀量詞(如 (a+)+),並盡量使用具體的字元類別而非通配符。
如何學習更進階的正則表達式?
掌握基礎後,可以進一步學習前瞻斷言(Lookahead)、後顧斷言(Lookbehind)、命名捕獲群組等進階功能。持續練習是最好的學習方式。
相關工具推薦
- 正則表達式測試器 [blocked]:即時測試和驗證正則表達式
- 文字比對工具 [blocked]:比較兩段文字的差異
- URL 編碼/解碼器 [blocked]:處理 URL 中的特殊字元
- JSON 格式化工具 [blocked]:格式化和驗證 JSON 數據
立即使用我們的免費正則測試器 [blocked],邊學邊練,快速掌握正則表達式!



