Delphi2007で正規表現 テンプレートで置き換え

先日から使っているTRegExprですが、Delphi2007でも特に問題は起こっていません。

やはりクラスはコード内に適当に入れて動くので、 コンポーネントよりも小回りが聞くときが多いですね。

その機能の一つに( )で囲んでマッチした文字列をテンプレートとなる文字列に埋め込んで出力するものがあります。これは便利!

ということで使い方

当たり前ですが、使う前にRegExprをusesに入れてください。

procedure TForm1.Button1Click(Sender: TObject);
const
SearchTxt = '(\d+)';
Template = '金額は$1円です。';
var
r : TRegExpr;
begin
r := TRegExpr.Create;
try
r.Expression := SearchTxt;
if r.Exec ('あなたが買った品物は\5250です。') then
ShowMessage(r.Substitute (Template));
finally
r.Free;
end;
end;

 

これだけで「あなたが買った品物は\5250です。」から5250を抽出し、「金額は5250円です。」と表示します。

 

Execが成功すると( )で囲んだ文字が1~nで記憶されます。先頭は0ではなく1ということに注意。

0はマッチした文字列全体になりますので、たとえば

procedure TForm1.Button1Click(Sender: TObject);
const
SearchTxt = '(\d+).*?(\d+)';
Template = '金額は$0円です。';
var
r : TRegExpr;
begin
r := TRegExpr.Create;
try
r.Expression := SearchTxt;
if r.Exec ('あなたが買った品物は\5250と\8540です。') then
ShowMessage(r.Substitute (Template));
finally
r.Free;
end;
end;

 

こんな風にした場合、$0を入れると「金額は5250と\8540円です。」となってしまいます。

テンプレートを$1もしくは$2にすれば、この場合は金額が入ってくるわけですね。

Template = ‘金額は$1円と$2円です。’;とすれば、無事に「金額は5250円と8540円です。」と表示されました。