2016-03-18 11 views
0

たとえば、この電子メールの正規表現検証: ^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$をご覧ください。注意深く見ると3つの部分があります:品物、@文字、その他のものです。正規表現では電子メールアドレスに@が必要なので、文字列aaaaaaaaaaaaaaaaaaaaaa!は一致しません。正規表現エンジンでは、必要な文字がすべて文字列内にあることを確認しないのはなぜですか?

しかし、ほとんどの正規表現engineは、この組み合わせで突発的にバックトラックします。 (PCRE、Regex101のパワーは、ほとんどのものよりもスマートですが、他の正規表現や文字列の組み合わせは壊滅的なバックトラッキングを引き起こす可能性があります)。

Big Oについて多くのことを知る必要はなく、コンビナトリアルは指数関数。だから正規表現エンジンは、文字列に必要な文字が含まれていることを確認しないでください(なぜなら、早​​期に終了することができるからです)。

残念なことに、私が大惨事のバックトラックについて読んだことの大部分は、正規表現エンジン/コンパイラがより良くする必要がある可能性を探る代わりに、悪い正規表現を書く正規表現ライターに責任を課します。正規表現のエンジン/コンパイラを見ているものがいくつか見つかりましたが、あまりにも技術的です。より多くの経験を得た後、バック来る


、私は正規表現は、コンピュータではなく、プログラマによって決定された実行計画を意味し、declarativeであることを知っています。最適化は、正規表現エンジンが最も異なる方法の1つです。

PCREとPerlは、バックトラック制御動詞の導入によって宣言的な現状に挑戦してきましたが、動詞のない他のエンジンであり、大惨事を繰り返している可能性があります。

+0

'lazy'数量詞' 'と' '*戦場に出た:それは間違っているツールです。それは、マッチングを効率的にするために賢明に使用するのは作者にあります。デフォルトでは、正規表現は** 'greedy' **であり、すべての組み合わせをチェックします。 –

+0

我々は学術的な関心率を取る場合、これは持っていることがあります。たぶん、代わりの全体の正規表現エンジンは(書き換えられることを要求し、1ではなく、特定のケースから、想定しそのせいワット複雑な問題に簡単に()一般解(| SH)ウルド?存在するのはむしろ大胆であるかもしれません)、プログラマは既にこのような問題について知っていますが、ここではスマートなものでなければなりません。最初に '@'自身のstrpos/indexのチェックをしてください。 (あなたも試してみて、電子メールアドレスを確認する正規表現「解決策」を考え出すを試みるべきではありません、我々はあまりにも、彼らはすでに、すでに知っていると仮定し¹;) – CBroe

+0

@CBroeははい、私はうまく(電子メールの検証のための正規表現を使用しないように知っています私はおそらくこれではなく、警告するだろうが、失敗を通るだろうが)、実際の例を使いたいと思った。 '...今、私たちはどのくらいの時間をしたいと思う(... | B | | CDE)や、'など、より複雑な状況、 - – Laurel

答えて

4

私は本当に、あなたは間違った方法これを取っていると思う:

は残念ながら、私は壊滅的なバックトラックについて読んだことのほとんどは、代わりに探索する、邪悪な正規表現を記述するための正規表現のライターに責任を置きます正規表現のエンジン/コンパイラがより良くなる必要がある可能性。私は正規表現エンジン/コンパイラを見るいくつかのソースを見つけましたが、それはあまりにも技術的です。

正規表現を書くと、正規表現エンジンは書いたプログラムに従う必要があります。 複雑なプログラムを書くと、エンジンはそれについて何もできません。この正規表現は、@を探す前にまず「もの」とマッチする必要があると指定しています。

コンパイラの作成にはあまり関与していませんが、この場合、静的な要素をすべて最初に特定することが可能です(ここでは@と記載されています)。悲しいことに、一般的なケースでは、静的要素が複数ある場合も、全くない場合もあるので、これは本当に役に立ちません。

スピードを気にする人は、 @と平易な線形検索を入力してから正規表現を探してください。

正規表現は、線形検索エンジンほど高速ではありませんでした。なぜなら、それらはむしろはるかに強力であるためです。

あなたは裁判官(複雑なプログラムである正規表現ではなく正規表現エンジン)に間違った人物を服用しているだけでなく、犯罪被害者@文字を探しているだけの速度ですが、まだ正規表現を使用しています)。


ところで、正規表現で電子メールアドレスを検証しないでください。 ?このような場合には http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

+0

_ _「は、2つ以上の静的要素または全てでどれがあるかもしれないいずれかの理由」そのような「静的」なものを分析して検索するのに使う正規表現エンジン(特定のケースでは完全な検索/マッチをより簡単にするかもしれないから)があります。 – CBroe

+2

この回答の重要な情報は、*正規表現はプログラム*です。その上、いくつかの正規表現エンジンはいくつかの最適化を行います。たとえば、可能であれば、.NETエンジンはBoyer-Moore検索を実行します(http://stackoverflow.com/a/32618592/3764814)。 PCREには、「最小限必要な文字列長」アプローチがあります。他のエンジンは、他のトリックを行う可能性があります。 –

+0

@CBroe正規表現をコンパイルし、サンプルデータセットでいくつかの異なる実装をテストし、パフォーマンスを比較し、正しいものを使用することが可能かもしれないと主張するかもしれません。それでは、パフォーマンスが**重大である場合、正規表現が最初の間違ったツールであることを直ちに認識します。 –

関連する問題