首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

深入淺出正則表達式:從入門到精通的完整指南

     編輯:VC 教學

前言

正則表達式 是文本處理的瑞士軍刀。半年前我為系統學習 Regex 翻譯了 RegexBuddy 官方教程(作者 Jan Goyvaerts),公認最淺顯易懂的入門資料。本文保留「深入淺出」之名,因其確切傳達了「由淺入深、知其然更知其所以然」的學習體驗。版權歸原作者,轉載請註明出處。

一、什麼是正則表達式

Regex(Regular Expression)是一種「描述文本模式」的語言。引擎根據模式在目標字串中搜尋匹配。本教程聚焦 Perl 5 風格引擎(PCRE、.NET、Java、JavaScript 等多數現代引擎均屬此類)。

二、字面字元與基本匹配

  • a 匹配第一個 'a';cat 匹配連續 'c' 'a' 't'。
  • 預設**區分大小寫**;需啟用「忽略大小寫」選項才匹配 'Cat'。
  • 引擎預設只返回第一個匹配;後續匹配需呼叫「查找下一個」或對應 API(如 Regex.Match.NextMatch())。

三、元字元:正則的核心能力

11 個保留字元:[ ] \ ^ $ . | ? * + ( )。若要匹配字面值,**必須轉義**(前加 \)。

元字元含義範例
.任意單一字元(除換行)c.t 匹配 cat, cot, c3t
\d數字 [0-9]\d{3}-\d{4} 電話號碼
\w單字字元 [a-zA-Z0-9_]\w+ 匹配單字
\s空白字元\s+ 多個空格
^行首(多行模式下)^Start
$行尾(多行模式下)End$
[abc]字元集合[aeiou] 元音
[^abc]排除字元集合[^0-9] 非數字
|或邏輯cat|dog
()分組/捕獲(\d{4})-(\d{2}) 年-月
?0 或 1 次colou?r color/colour
*0 次或多次ab*c ac, abc, abbc...
+1 次或多次\d+ 至少一位數字
{n,m}量詞範圍\d{2,4} 2-4 位數字

四、進階結構:錨點、邊界、斷言

  • \b 單字邊界;\B 非單字邊界。
  • (?=pattern) 正向前瞻(零寬斷言):\d+(?=px) 匹配後面跟 px 的數字,但不消耗 px。
  • (?!pattern) 負向前瞻:\d+(?!px) 匹配不跟 px 的數字。
  • (?<=pattern) 正向後顧(固定寬度):(?<=\$)\d+ 匹配 $ 後的數字。
  • (? 負向後顧。

五、貪婪 vs 惰性 vs 佔有優先量詞

模式行為範例輸入 <tag>content</tag>
<.+>貪婪:匹配最長整串 <tag>content</tag>
<.+?>惰性:匹配最短<tag>
<.++>佔有優先:不回溯失敗(因 . 匹配了 > 導致後面無法匹配)

**實戰建議**:能用惰性/佔有優先就不用貪婪,大幅降低回溯導致的效能災難(ReDoS)。

六、分組與反向引用

  • (...) 捕獲組,編號從 1 開始;(?:...) 非捕獲組(不佔編號,效能稍好)。
  • \1 \2... 在模式中反向引用;替換字串中用 $1 $2。
  • 命名捕獲:(?<year>\d{4}),引用 \k<year> 或 ${year}。

七、常見陷阱與最佳實踐

  1. 轉義地獄:字串字面值中雙重轉義(C++ "\\\\d+" → Regex \\d+ → 匹配 \d)。使用原始字串字面值(C++11 R"(\d+)"、C# @"\d+"、Python r"\d+")。
  2. 點號陷阱:. 不匹配換行,除非啟用 Singleline/DOTALL 模式。
  3. 錨點誤區:^$ 預設匹配整字串首尾,多行模式下匹配行首尾。
  4. 效能殺手:巢狀量詞 (a+)+、大量回溯模式。善用 atomic group (?>...) 或佔有優先量詞。
  5. Unicode 支援:\p{L} 匹配任意 Unicode 字母,\X 匹配擴展書寫字素簇。

八、工具推薦

  • RegexBuddy:教學、測試、除錯、代碼生成一站式(本文教程來源)。
  • Regex101 / RegExr:線上即時測試,支援多語言風格切換。
  • IDE 內建:VS Code、Visual Studio、JetBrains 系列皆有優秀 Regex 測試視窗。

九、結語

正則表達式看似晦澀,實則邏輯嚴密。掌握「字面、元字元、量詞、分組、斷言、貪婪/惰性」六大支柱,配合工具實戰演練,即能驾駭 90% 文本處理需求。記住:**可讀性優於炫技**,複雜模式請拆解註釋,善用 (?x) 忽略空白模式撰寫自文檔化 Regex。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved