Delphi XEからは正規表現ライブラリが標準搭載されています。
ユニットは「System.RegularExpressions」
このライブラリを試してみたいと思います。
(2012.09.12追記 「XE2から搭載されていた」と書いていましたが、RegularExpressionはXE1から搭載されていたようです。XE1を買ってなかったので思い込みました。@arigayasさんありがとう!@arigayasさんの記事もご参照ください。)
いままでは搭載されていなかった正規表現ライブラリ
XE1までのDelphiには正規表現ライブラリは搭載されておらず、外部ライブラリを使っていました。
特に使いやすいのが小宮秀一さん作の「SkRegExp」。Perl5.8互換で、100% Delphiで書かれていて、DLLも必要としないので非常に使いやすいライブラリです。
標準搭載が必要なわけ
ただ、やはり「Delphiに標準搭載」という部分は捨てがたい魅力です。
- 商用なので長期的なサポートが見込める
- 新しいDelphiでも、更新を待たずに使える
- 検索パスなどを追記しなくても良い
などです。
使い方
では使い方です。
このようなフォームを設計しました。
見たまんまですが、上から
- 原文を記入する 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)してみましょう。
細かな解説
m := TRegEx.Match(Edit1.Text, Edit2.Text);
この部分で、正規表現チェックをします。
mはTMatch型で、Successプロパティに判定が成功したか、失敗したかが入っています。
グループにマッチした部分はGroupsプロパティに入ります。GroupsはTGroupCollection型の配列です。あとはGroups.Countの回数だけ取り出せば、すべてのグループデータが手に入ります。
ちなみにGroups[0]にはマッチした部分全体が入っています。グループそれぞれのデータは[1]から始まる点に注意してください。
今回のプロジェクトソースはこちらからダウンロードしてください。
https://worktoolsmith.com/software/RegularExpressions.zip
![WorkToolSmith [ワークツールスミス]](https://worktoolsmith.com/wp/wp-content/uploads/2014/11/d30716bfc62ca82b12c303b90f356916.png)
