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

Delphi 正則表達式語法詳解 (6):貪婪與非貪婪量詞完整對照

     編輯:Delphi

量詞預設為貪婪模式 (盡可能多匹配),加上 ? 切換為非貪婪 (盡可能少匹配),兩種模式行為差異巨大。

經典範例:HTML 標籤匹配

貪婪匹配 (預設)

reg.Subject := '標題內容'; 
reg.RegEx := '<.*>'; { 貪婪:從第一個 < 匹配到最後一個 > }
reg.Replacement := '◆'; 
reg.ReplaceAll; 
{ 輸出: ◆ }

非貪婪匹配

reg.RegEx := '<.*?>'; { *? 非貪婪:匹配每組 <> }
reg.ReplaceAll; 
{ 輸出: ◆◆◆標題◆◆◆內容◆◆ }

完整量詞對照表

貪婪非貪婪匹配次數說明
???0 或 1可選項
++?1 或多至少一次
**?0 或多任意次數
{n}{n}?恰好 n固定次數
{n,m}{n,m}?n 到 m範圍次數
{n,}{n,}?n 或更多下限固定

核心差異機制

  • 貪婪:先嘗試匹配最長,失敗再回溯縮短 (Backtracking)
  • 非貪婪:先嘗試匹配最短,失敗再擴展
  • 效能:貪婪在失敗時回溯開銷大;非貪婪在成功時可能多次嘗試
  • 正確性:巢狀結構、分隔符匹配通常需非貪婪

實用判斷原則

  1. 後面有明確結束標記 (如 >、"、;) → 用非貪婪 *?/+?
  2. 匹配到字串結尾或固定長度 → 貪婪較快
  3. 不確定時 → 先試非貪婪,較不易產生「匹配過多」錯誤

preUnGreedy 選項

reg.Options := [preUnGreedy]; { 全域啟用非貪婪,等同所有量詞自動加 ? }

理解貪婪/非貪婪機制,是避免正則「匹配過多」經典陷阱的關鍵。

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