2009-07-10 24 views
4

最初に、正規表現のパターンが有効かどうかを調べるための関数が組み込まれているのかどうか疑問に思っていました。式が機能するかどうかを確認する必要はありません。可能であれば、パターンの構文が正しいことを確認するだけです。正規表現のパターンがPerlで有効かどうかを確認する方法はありますか?

機能が組み込まれていない場合は、どうすれば自分で行うのですか?私はする必要がありますか?

私が検索できる組み込み関数/モジュールのディレクトリがありますので、このような疑問を避けることができますか?ありがとうございました。

EDIT:ユーザー入力に基づいてこれらのパターンをオンザフライで生成することを計画していることを言及する必要があります。そのため、実際に実行されることを確認するために検証する必要があります。

答えて

20

は、私はPerlの専門家でありませんが、多分thisは助けることができます返す

#!/usr/bin/perl 

my $pattern = "["; # <-insert your pattern here 
my $regex = eval { qr/$pattern/ }; 
die "invalid regex: [email protected]" if [email protected]; 

は、この:あなたの2番目の質問については

invalid regex: Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE/at test.pl line 4. 

あなたは常にCPANで仕事の巨大な体をチェックアウトすることができ。

+2

これがサーバーの場合は、ユーザーが入力を生成して任意のコードを実行させないように注意してください。私はそれをどうやって起こせるかわかりませんが、それは保証ではありません。 –

+0

@George:これは非常に良い点です、言及いただきありがとうございます。 – bernie

+1

私は今日、国境にあった。そして、perlの料理本はevalも提案した。 – radicalmatt

2

ここで「有効」とは何を意味するのかよく分かりません。式が文法的に括弧で囲まれていない場合(例えば、括弧がない場合)、インタープリタはあなたに知らせ、プログラムはコンパイルされません。

しかし、これは論理的または意味的なエラーからあなたを守るものではありません。つまり、あなたの正規表現は有効なPerlであるかもしれませんが、恐ろしいことをするか、まったく何もしません。たぶん、YAPE::Regex::Explainのような正規表現の説明が必要になります。

1

使用できるもう1つのcpanモジュール:Regexp::Parser。ドキュメントから:

my $parser = Regexp::Parser->new; 
if (! $parser->regex($rx)) { 
    my $errmsg = $parser->errmsg; 
    my $errnum = $parser->errnum; 
    # ... 
} 
関連する問題