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