Delphi XE2の正規表現「System.RegularExpressions」を試す

Delphi XEからは正規表現ライブラリが標準搭載されています。

ユニットは「System.RegularExpressions

このライブラリを試してみたいと思います。

 

(2012.09.12追記  「XE2から搭載されていた」と書いていましたが、RegularExpressionはXE1から搭載されていたようです。XE1を買ってなかったので思い込みました。@arigayasさんありがとう!@arigayasさんの記事もご参照ください。)

いままでは搭載されていなかった正規表現ライブラリ

XE1までのDelphiには正規表現ライブラリは搭載されておらず、外部ライブラリを使っていました。

特に使いやすいのが小宮秀一さん作の「SkRegExp」。Perl5.8互換で、100% Delphiで書かれていて、DLLも必要としないので非常に使いやすいライブラリです。

標準搭載が必要なわけ

ただ、やはり「Delphiに標準搭載」という部分は捨てがたい魅力です。

  • 商用なので長期的なサポートが見込める
  • 新しいDelphiでも、更新を待たずに使える
  • 検索パスなどを追記しなくても良い

などです。

使い方

では使い方です。

image

このようなフォームを設計しました。

 

見たまんまですが、上から

  • 原文を記入する Edit1
  • 正規表現を記入する Edit2
  • 実行ボタン Button1
  • 出力を行う Memo1

となっています。

 

まずは uses節に「System.RegularExpressions」ユニットを加えます。

 

usesは以下のようになると思います。

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  System.RegularExpressions, Vcl.StdCtrls;

 

次にButton1のOnClickイベントに次のコードを記入します。

procedure TForm1.Button1Click(Sender: TObject);
var
  m: TMatch;
  i: Integer;
begin
  m := TRegEx.Match(Edit1.Text, Edit2.Text);

  Memo1.Clear;
  if m.Success then
  begin
    Memo1.Lines.Add('Success');
    Memo1.Lines.Add(m.Value);
    Memo1.Lines.Add('グループ数 : ' + IntToStr(m.Groups.Count));

    for i := 0 to m.Groups.Count - 1 do
    begin
      Memo1.Lines.Add(Format('グループ%d : %s', [i, m.Groups[i].Value]));
    end;
  end
  else
    Memo1.Lines.Add('NG');
end;

 

コンパイルして実行(F9)してみましょう。

 

image
「実行」ボタンを押すと、このように表示されます。

細かな解説

m := TRegEx.Match(Edit1.Text, Edit2.Text);

この部分で、正規表現チェックをします。

mはTMatch型で、Successプロパティに判定が成功したか、失敗したかが入っています。

グループにマッチした部分はGroupsプロパティに入ります。GroupsはTGroupCollection型の配列です。あとはGroups.Countの回数だけ取り出せば、すべてのグループデータが手に入ります。

ちなみにGroups[0]にはマッチした部分全体が入っています。グループそれぞれのデータは[1]から始まる点に注意してください。

 

今回のプロジェクトソースはこちらからダウンロードしてください。
https://worktoolsmith.com/software/RegularExpressions.zip