正則表達式中的子表達式 (捕獲組) 是進階文字處理的核心,TPerlRegEx 提供完整的捕獲存取機制。
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'CodeGear Delphi 2007';
reg.RegEx := 'Delphi';
while reg.MatchAgain do
begin
ShowMessage(reg.MatchedExpression); { Delphi - 整個匹配內容 }
ShowMessage(reg.SubExpressions[0]); { Delphi - 等同 MatchedExpression }
end;
FreeAndNil(reg);
end;
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'abc A1111 BB222 CCC33 DDDD4';
reg.RegEx := '\b([A-D]+)([1-4]+)\b'; { 兩個子表達式:字母組 + 數字組 }
while reg.MatchAgain do
begin
ShowMessage(reg.SubExpressions[0]); { 整個匹配: A1111, BB222, CCC33, DDDD4 }
ShowMessage(reg.SubExpressions[1]); { 第1子表達式: A, BB, CCC, DDDD }
ShowMessage(reg.SubExpressions[2]); { 第2子表達式: 1111, 222, 33, 4 }
{ 額外資訊屬性 }
{ reg.SubExpressionCount: 子表達式總數 (此例為 2) }
{ reg.SubExpressionLengths[n]: 第 n 子表達式匹配長度 }
{ reg.SubExpressionOffsets[n]: 第 n 子表達式在源字串中的位移 }
end;
FreeAndNil(reg);
end;
| 索引 | 含義 | 別名 |
|---|---|---|
| 0 | 整個正則表達式匹配的內容 | MatchedExpression |
| 1 | 第 1 個括號組捕獲的內容 | |
| 2 | 第 2 個括號組捕獲的內容 | |
| n | 第 n 個括號組捕獲的內容 | 最大 99 (MAX_SUBEXPRESSIONS) |
reg.Replacement := '\1-\2'; { 引用第1、2捕獲組 }
reg.Replacement := '$1-$2'; { 同樣效果,$ 語法更通用 }
MAX_SUBEXPRESSIONS = 99 (內建常數)(?:...) 不佔用索引熟練掌握子表達式捕獲與引用,是編寫強大文字處理邏輯的關鍵技能。