正規表現が適切か調べる

Delphi,FMX,Programing,TRegEx,VCL,正規表現

Delphi正規表現を扱う時に使うであろうTRegExクラス。
非常に便利ではあるんですが、正規表現に適切でない文字列を引数として渡すと当然ですが例外が発生します。
例外を発生させたくない場合、TRegExクラスメソッドの引数として与える前にこの文字列が適切かどうかを調べる必要があります。

ということで用意しました。

実装

ソースは以下そのまま。

unit TsuRegularExpressionsUtils;
interface
uses
System.RegularExpressionsAPI, System.RegularExpressionsCore;
function TsfRegPattarnCheck(pattarn:string):Boolean;
implementation
function TsfRegPattarnCheck(pattarn:string):Boolean;
var
Error: MarshaledAString;
ErrorOffset: Integer;
begin
Result  :=  (pattarn <> '') and
(pcre_compile(PCRE_STR(PCREString(pattarn)),
(PCRE_UTF8 or PCRE_NEWLINE_ANY),
@Error,
@ErrorOffset,
pcre_maketables) <> nil);
end;
end.

TsfRegPattarnCheck関数は、引数として与えた文字列が正規表現として適切な場合True、そうでない場合はFalseを返します。
Falseを返すパターンは

  • 空文字列の場合
  • pcre_compile関数が返す値がnilだった場合

の2つで、どちらかでも該当すればFalseです。
空文字だった場合、というのはわかりやすいですがpcre_compile関数とは。。。?

PCREとは

pcre_compile関数とはPCREと呼ばれるライブラリに含まれている関数です。
PCREというのはPerl Compatible Regular Expressionsの略で、Perl互換の正規表現C言語で実装したライブラリのことです。
Delphi正規表現はこのPCREを使って実装されています。
で、pcre_compileというのは与えられた正規表現を内部形式にコンパイルするもの。
正しい正規表現であればそのポインタが返ってきますが、そうでなければnull(Delphi的にはnil)が返ってくるというものです。
詳細はこちらを参照ください。オプションビットの詳細などもここに書いてあります。
pcre_compile specification
ちなみに、ここで使われている

  PCRE_UTF8 or PCRE_NEWLINE_ANY

これは、TRegExで使われているオプションビットと同じものです。

ということで快適な正規表現ライフを(