正規表現が適切か調べる
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で使われているオプションビットと同じものです。
ということで快適な正規表現ライフを(
ディスカッション
コメント一覧
まだ、コメントがありません