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

深入淺出正則表達式完整教學:從入門到引擎內部機制

     編輯:關於C++

什麼是正則表達式

描述文字模式的語言。Regex = Regular Expression。最基本模式為純文字,如 cat 匹配 "About cats"。

引擎類型

  • Regex-directed (NFA):支援回溯、貪婪/惰性量詞、反向引用。主流引擎(Perl、PCRE、.NET、Java)皆屬此類。
  • Text-directed (DFA):不回溯、不支援上述進階功能。

測試:regex|regex not 匹配 "regex not" → 若匹配 "regex" 為 NFA;匹配 "regex not" 為 DFA。

核心語法詳解

字元與中繼字元

11 個中繼字元:[ ] \ ^ $ . | ? * + ( )。需匹配字面值時以反斜槓逸出。程式語言中雙重逸出(如 C++ \\\\ 匹配單一反斜槓)。

字元類別 []

  • [ae] 匹配 a 或 e。[0-9a-fA-F] 十六進位字元。
  • 排除類別 [^...]:[^u] 匹配非 u 字元(含換行)。注意:q[^u] 需匹配 q 後接一非 u 字元,不匹配字串結尾的 q。
  • 簡寫:\d=[0-9]、\w=[A-Za-z0-9_]、\s 空白字元。大寫為反義:\D、\W、\S。

量詞 ?, *, +, {m,n}

  • ? 0 或 1、* 0 或多、+ 1 或多、{3,5} 3~5 次。
  • 貪婪:盡可能多匹配,失敗時回溯。<.+> 匹配 "first" 整串而非單一標籤。
  • 惰性:量詞後加 ?(+?、*?、{3,5}?),盡可能少匹配。<.+?> 正確匹配 ""。
  • 最佳替代:排除類別 <[^>]+> 無回溯、效能最佳。

錨點 ^ $ \A \Z \b \B

  • ^ 行首、$ 行尾。多行模式下匹配每行首尾。
  • \A 字串絕對開頭、\Z 字串絕對結尾(忽略多行模式)。
  • \b 單字邊界(\w 與 \W 交界)、\B 非單字邊界。

選擇 | 與優先序

優先序最低。Get|GetValue|Set|SetValue 匹配 "SetValue" 會回傳 "Set"(NFA 急切回傳)。解法:調整順序置長者優先、使用選擇群組 (Get|GetValue)、或加入單字邊界 \b(Get|Set)(Value)?\b。

群組與反向引用

  • (...) 建立捕獲群組,編號自 1 起。\1 引用第一群組匹配內容。
  • 應用:HTML 標籤配對 <([A-Z][A-Z0-9]*)[^>]*>.*?</\1>、偵測重複單字 \b(\w+)\s+\1\b。
  • 非捕獲群組 (?:...) 不佔用編號、提升效能。
  • 量詞作用於群組時,反向引用僅保留最後一次匹配內容。

前瞻與後瞻

  • 肯定前瞻 (?=...)、否定前瞻 (?!...):不消耗字元,僅斷言其後內容是否匹配。例:q(?!u) 匹配非 u 後續的 q(含字串結尾)。
  • 肯定後瞻 (?<=...)、否定後瞻 (?<!...):斷言前方內容。注意:後瞻需固定寬度(大多引擎限制)。
  • 應用:匹配含 "cat" 的 6 字單字 \b(?=\w{6}\b)\w*cat\w*。

條件判斷

(?(?=regex)then|else):依前瞻結果決定匹配分支。前瞻不消耗字元,分支從相同位置嘗試。

註解與模式修飾符

  • (?#comment) 內嵌註解。
  • 模式:(?i) 忽略大小寫、(?s) 單行模式(.匹配換行)、(?m) 多行模式(^$匹配行首尾)。區段控制:(?i)te(?-i)st 僅 "te" 不分大小寫。

原子群組

(?>...):內部匹配失敗時直接回溯至群組之前,防止災難性回溯。例:^(?>(.*?,){11})P 失敗時僅回溯 1 次而非指數級。

引擎內部運作觀念

NFA 引擎採「左most longest(貪婪)」或「左most shortest(惰性)」策略,逐字元嘗試、回溯。理解回溯機制是撰寫高效能正則的關鍵。

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