2013-07-30 3 views
8

与えられた正規表現がどんな文字列にもマッチするかどうかチェックできますか?具体的には、私は、関数を探しています.f $regexがすべての文字列と一致する場合はtrueを返します。与えられた正規表現が何かにマッチするかどうかをチェック

これは、「正規表現を指定すると、rと一致しない文字列が存在しますか?私はこれが "すべての文字列"のセットに境界を置くことなく解けるとは思わない。つまり、文字列に "blahblah"が含まれていないと仮定すると、rが "blahblah"と一致するかどうかを単に確認できます。しかし、もしそのような境界がないならどうでしょうか?正規表現r.*と等価であるかどうかをチェックすることで、この問題が解決できるかどうか疑問に思っています。

+4

私はこれが[停止問題](http://en.wikipedia.org/wiki/Halting_problem)と同等であると信じています。任意の正規表現が '。* 'と等価であるかどうかを判断するためのアルゴリズムを記述することはできないかもしれません。 –

+0

ルックアングルと後方参照を持つ正規表現ですが、コード補間はなく、文脈依存文法のサブセットでなければなりません。これらの言語を決定することは完全なチューリングではないため、この問題は停止問題と同じであってはなりません。 * CSGを指定すると、*がルールを代入することによってこの言語の文字列を生成することができる場合、禁止された置換を適用して、その言語ではない文字列を生成する可能性があります。悲しいことに、私はこれが事実であるかどうかわからないし、私はこれの証拠を描くことができないだろう。 – amon

+2

これは「空の問題」と呼ばれ、DFA/NFA(逆参照/見回しのない正規表現)で決定可能です。http://www.cs.miami.edu/~ogihara/csc527/new04-1.pdf 逆説(文脈に敏感な文法)との正規表現では、空の問題は決めることができません。(私はすぐに証拠を見つけることができませんが、文献で頻繁に言及されています) – rmmh

答えて

12

これはまさにあなたの質問に答えていませんが、簡単な答えはで来るのは難しいですなぜうまくいけば少し説明:

まず、用語「正規表現」は少し暗いです、これだけ明確にするために、我々

  • 確定的有限オートマトン(DFAs)に相当する「厳密な」正規表現です。
  • ルックアヘッド、バックレファレンスなどのようなベルとホイッスルを追加するPerl互換の正規表現(PCRE)。これらはPythonやJavaなどの他の言語でも実装されています。
  • 実際のPerl正規表現は、?{...}構文を使用して、任意のPerlコードを含め、さらに狂ったようになります。

この問題は、厳密な正規表現では解決できると思います。対応するDFAを作成し、そのグラフを検索して、非受諾状態へのパスがあるかどうかを確認します。しかし、これは通常、PCREである '実世界'の正規表現には役立ちません。

私はPCREがチューリング完全ではないと思っています(わかりませんが、この質問も参照してください:Are Perl regexes turing complete?)。もしそうなら、私はJim Garrisonがコメントしたように、これは基本的に停止問題です。 しかし、上記の方法を役に立たないものにするために、それらをDFAに変換することは容易ではありません...

私はPCREの回答はありませんが、上記の構文(後方参照など)それはかなり難しいだろう、私は想像しています。私は「不可能」と言っています。

本物のPerl正規表現?{...}は、確かにチューリングが完了しているので、ドラゴンズがあります。あなたは運が悪いと思います。

+0

すばらしい返信です。あなたは私が思っていたものを強化しました。私がアドレッシングしているユースケースでは、実際のperl正規表現は気になるものです。ほとんどどこでも 'eval {'xx' =〜m/$ regex/i; } 'は評価に成功します。 –

関連する問題