前言
正則表達式 是用特定模式匹配字串的強大工具,廣泛應用於驗證、搜尋、替換、擷取等字串處理場景。本文從定義、起源、分類、引擎機制到實際應用全方位介紹。
什麼是正則表達式
多重定義視角:
- 模式匹配公式:用某種模式描述一類字串
- 字串匹配模板:由一般字元與中繼字元組成的文字模式
- 規則描述代碼:記錄文本規則,用於查找/替換/擷取
- 特徵驗證器:用一個「字串」描述特徵,驗證另一個「字串」是否符合
歷史起源
- 1943:McCulloch & Pitts 以數學描述神經網路
- 1956:Stephen Kleene 發表「神經網路事件表示法」,引入「正則表達式」術語,定義為「正則集的代數表達式」
- 1968:Ken Thompson 將正則表達式引入 QED 編輯器,後移植至 Unix
ed、grep
- 現代:Perl、PCRE、Java、.NET、JavaScript 等廣泛支援
正則表達式與萬用字元比較
| 特性 | 萬用字元 | 正則表達式 |
| 語法 | * ? | 豐富的中繼字元:. * + ? [] () | ^ $ 等 |
| 精確度 | 低(只能簡單匹配) | 高(可描述複雜結構) |
| 範例 | *.doc | \w+\.docx?$ |
引擎機制:NFA vs DFA
- NFA(非確定性有限自動機):Perl、PCRE、Java、.NET、JavaScript 採用。同一字串可產生多種理解,**可能回溯**,效率通常較低但功能強大(支援反向參考、環視等)
- DFA(確定性有限自動機):lex、awk、GNU grep (不含 -P) 採用。唯一理解路徑,**無回溯**,匹配速度快但功能受限
實務啟示:撰寫正則時盡量減少回溯(避免嵌套量詞、善用佔有優先量詞 ++ *+、具體化字元類別)以提升效能。
匹配的三種語法角色
- 形容詞性:「這字串匹配該正則」
- 動詞性:「在文本中匹配正則」
- 名詞性:「滿足正則的那一段子字串」(一個 match 物件)
四大核心應用場景
| 應用 | 說明 | 典型範例 |
| 驗證 | 檢查字串是否符合格式 | Email、URL、身分證號、手機號、密碼強度 |
| 查找 | 從文本找出符合模式的片段 | 日誌分析、關鍵字提取、程式碼搜尋 |
| 替換 | 將匹配部分替換為新字串 | 敏感詞過濾、格式統一、模板渲染 |
| 擷取 | 取出匹配的子字串供後續使用 | 網頁爬蟲、資料解析、分組捕獲 |
常見支援環境
- 作業系統:Linux、Unix、HP-UX、Windows (PowerShell)
- 程式語言:C#、PHP、Java、Python、JavaScript、Go、Rust、C++11
<regex>
- 工具軟體:VS Code、Notepad++、grep、sed、awk、EditPlus、UltraEdit
入門建議
- 先掌握核心中繼字元:
. * + ? ^ $ [] () | \
- 理解貪婪/非貪婪/佔有優先量詞差異
- 善用線上測試工具:Regex101、RegExr、Debuggex
- 實戰練習:從簡單驗證開始,逐步挑戰複雜解析