零寬度斷言 (Zero-width Assertions) 不消耗字元,僅檢查位置前後的內容,是精準匹配的利器。
| 語法 | 名稱 | 含義 | 範例 |
|---|---|---|---|
(?=...) | 正向預搜尋 | 右側必須匹配 ... | Delphi (?=2007) 僅匹配後接 2007 的 Delphi |
(?!...) | 負向預搜尋 | 右側必須不匹配 ... | Delphi (?!2007) 匹配非後接 2007 的 Delphi |
(?<=...) | 正向回顧 | 左側必須匹配 ... | (?<=\$)\d{3} 匹配左側為 $ 的三位數 |
(? | 負向回顧 | 左側必須不匹配 ... | (? 匹配左側非 $ 的三位數 |
reg.Subject := 'Delphi 6; Delphi 7; Delphi 2007; Delphi Net';
reg.RegEx := 'Delphi (?=2007)';
reg.Replacement := '◆';
reg.ReplaceAll;
{ 輸出: Delphi 6; Delphi 7; ◆2007; Delphi Net }
reg.RegEx := 'Delphi (?!2007)';
{ 輸出: ◆6; ◆7; Delphi 2007; ◆Net }
reg.Subject := '111, 222, $333, $444';
reg.RegEx := '(?<=\$)\d{3}';
reg.Replacement := '◆';
{ 輸出: 111, 222, $◆, $◆ }
reg.RegEx := '(?{ 輸出: ◆, ◆, $333, $444 }
(?<=...) 固定寬度限制:某些引擎要求回顧斷言為固定長度,Delphi PCRE 相容性良好{ 單詞邊界精確控制 }
\b(?=\w) { 單詞開始 }
\b(?<=\w) { 單詞結束 }
{ 千分位分隔符 (不匹配小數點後) }
(?<=\d)(?=(\d{3})+(?!\d))
掌握四大斷言,能解決「匹配但不捕獲」、「條件式邊界」等高階文字處理難題。