2011-01-19 23 views
48

特定の正規表現を使用し、正規表現が照合される特定の文字数に必要な操作の数に関して最悪の場合のシナリオを返すツールはありますか?正規表現のワーストケース解析

たとえば、(f|a)oo.*[ ]bazと指定すると、エンジンが100文字に一致する可能性があります。

複数のテキストサンプルを取得して、実行ごとに平均操作を表示できるツールがあれば興味があります。

私はこれが使用されているエンジンと実装に大きく依存することを認識していますが、これがどれほど共通しているかはわかりません。ですから、多くの言語で共通していると(私の質問をあまりにも曖昧にする)、私は特にPerlとPythonに興味があります。

+0

優秀な質問!明らかにそれは正規表現に依存します。純粋な正規表現(以下で参照される '(x + x +)+ y'の例のように)は純粋な有限状態機械のオートマトンを認めているが、一般的な正規表現ライブラリはバックトラックを持つものを実際に実装している文脈のようなもの。あなたが言っているようなツールはhttp://en.wikipedia.org/wiki/Regular_expression_Denial_of_Service_-_ReDoS –

答えて

22

Regexbuddy'sデバッガは、指定されたサンプルに一致するかどうかを判断するためにエンジンがどれくらいのステップを要するかを示します。 catastrophic backtrackingおよびdebugging regular expressionsについての詳細

catastrophic backtracking shown in RegexBuddy

PS:それは自由ではないですが、彼らは3ヶ月の返金保証を提供します。

+1

を捕まえるのが大好きです。私はそれを試していました - ジェフはそれのファンです:http://www.codinghorror.com /blog/2004/07/my-buddy-regex.html。しかし、私はちょっとプログラミングを考えていて、最適化の方向に向いていました。 –

11

エンジンに依存することに注意してください。正規表現理論は直線オートマトン理論に基づいているが、エンジンのほとんどはそれらの理論の厳格な翻訳ではない。この理由のために、例えば、いくつかのエンジンは指数関数的な時間で発生するが、厳密なNFA処理は行われない。

7

re.compilere.DEBUGを使用しているようなものを探しているかもしれません。詳細な説明については、Python Hidden Featuresコミュニティwikiのexcellent answerを参照してください。