剛剛試了一下 DelphiXE 新增的正則表達式組件, 它基於 C 語言編寫的 PCRE 庫實現, 感覺設計的非常好。
其主要的 TRegEx 被設計為一個結構(而不是類), 可能是基於效率的考慮;不過它主要調用了 TPerlRegEx 類的功能。
TRegEx 的五個主要方法 IsMatch()、Match()、Matches()、Replace()、Split() 都有相應的 class 方法,
所以一般情況下根本不需要手動實例化對象,直接使用 class 方法就夠了。
另:關於表達式語法可參加 Perl 5 的相關介紹。
uses RegularExpressions; //相關單元
const
pattern = '[A-Z]+\d+'; //測試用的表達式
txt = 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA'; //測試用的目標文本
{是否匹配成功}
procedure TForm1.Button1Click(Sender: TObject);
begin
if TRegEx.IsMatch(txt, pattern) then
begin
ShowMessage('有匹配到');
end;
end;
{獲取第一個匹配結果}
procedure TForm1.Button2Click(Sender: TObject);
var
match: TMatch;
begin
match := TRegEx.Match(txt, pattern);
if match.Success then //或用一句話 if TRegEx.Match(txt, pattern).Success then
begin
ShowMessage(match.Value); //AAA1
end;
end;
{獲取所有匹配結果}
procedure TForm1.Button3Click(Sender: TObject);
var
matchs: TMatchCollection;
match: TMatch;
i: Integer;
begin
matchs := TRegEx.Matches(txt, pattern);
Memo1.Clear;
for match in matchs do
begin
Memo1.Lines.Add(match.Value);
end;
Memo1.Lines.Add('----------');
for i := 0 to matchs.Count - 1 do
begin
Memo1.Lines.Add(matchs[i].Value);
end;
end;
{使用 TMatch 對象的 NextMatch 遍歷匹配結果時,需實例化對象}
procedure TForm1.Button4Click(Sender: TObject);
var
reg: TRegEx;
match: TMatch;
begin
reg := TRegEx.Create(pattern);
match := reg.Match(txt);
Memo1.Clear;
while match.Success do
begin
Memo1.Lines.Add(match.Value);
match := match.NextMatch;
end;
end;
{替換}
procedure TForm1.Button6Click(Sender: TObject);
begin
Memo1.Text := TRegEx.Replace(txt, pattern, 'xxx'); //xxx xxx xxx xxx xxx xxx AAAA
end;
{分割}
procedure TForm1.Button7Click(Sender: TObject);
var
rArr: TArray<string>;
s: string;
begin
rArr := TRegEx.Split('AAA,BBB;CCC,DDD EEE', '[,; ]');
Memo1.Clear;
for s in rArr do
begin
Memo1.Lines.Add(s); //AAA/BBB/CCC/DDD/EEE
end;
end;
{TRegEx 還有一個 class 方法 Escape, 用於給特殊字符轉義}
procedure TForm1.Button8Click(Sender: TObject);
begin
Memo1.Text := TRegEx.Escape('\[]^$.|?*+(){}'); //: \\\[\]\^\$\.\|\?\*\+\(\)\{\}
end;