反向引用 (Backreference) 允許在正則模式內部或替換字串中引用前面捕獲組的內容,實現強大的文字重組與驗證。
var reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'one two three four five six seven eight nine ten';
reg.RegEx := '\b([A-Za-z])[A-Za-z]*\b'; { 第1捕獲組: 首字母 }
reg.Replacement := '\1'; { 引用第1捕獲組 }
reg.ReplaceAll;
ShowMessage(reg.Subject); { 輸出: o t t f f s s e n t }
FreeAndNil(reg);
end;
reg.Subject := 'one two three ten';
reg.RegEx := '(t)(\w+)'; { 捕獲組1: t, 捕獲組2: 餘下字母 }
reg.Replacement := '[\1-\2:\0]'; { \1\2 引用捕獲組,\0 引用整個匹配 }
reg.ReplaceAll;
{ 輸出: one [t-wo:two] [t-hree:three] [t-en:ten] }
| 語境 | 引用整體 | 引用第1組 | 引用第2組 | 說明 |
|---|---|---|---|---|
| Replacement 字串 | \0 / $0 | \1 / $1 | \2 / $2 | 替換結果中插入捕獲內容 |
| RegEx 模式內部 | 不支援 | \1 | \2 | 模式中反向引用,如 (\w+)\s+\1 匹配重複單詞 |
{ 簡易版:匹配成對的標籤如 ... }
reg.RegEx := '<(\w+)>.*?\1>'; { \1 引用第一捕獲組 (標籤名) }
MAX_SUBEXPRESSIONS)(?:...) 非捕獲組不佔用編號(?<name>...) 在替換中用 ${name} 或 \k<name> 引用 (視引擎支援)反向引用是正則表達式從「匹配」邁向「處理」的關鍵橋樑,善用它能完成極其複雜的文字轉換任務。