2009-12-11 14 views
7

私はいくつかの正規表現(実際には数千文字)を持っています。あまり効率的ではないので、これらの正規表現をすべて1つの正規表現としてマージしたいと思います。例えばいくつかの正規表現を1つにマージする

、これらの正規表現を使用している場合:

  • 'のfoo *バー'
  • 'のfoo *のzip'
  • 'ザップ*バー'

私はしたいと思います'foo *(bar | zip)| zap * bar'のようなものを入手してください。

これを行うアルゴリズム、ライブラリ、ツールはありますか?

答えて

7

または(|)(およびストリングの始まり/終わりのアンカー)を使用して正規表現を連結することができます。

ほとんどの良い正規表現ライブラリは、正規表現からビルドした後、その有限状態オートマトンを最適化します。例えば、PCREはそうする。

この手順では通常、最適化の問題が処理されます。彼らはあなたが "手で"行う必要がある変換のほとんどを適用します。

+0

良い最初のステップですが、手作業で最適化する必要はありません。http://www.rexegg.com/regex-optimizations.html –

0

可能な場合でも、得られる正規表現がそれ以上効率的になるとは想像もできません。

+2

私は同意しません。 "foo"(?:bar | baz)の正規表現検索は、 "foo bar"の検索と "foo baz"の検索よりも速くなります。パート2回。 –

+1

-1オートマトンの構築方法は、多くの場合自動的に最適化されます。さらに、状態マシンをさらに最適化することもできます(Vladの答えを参照)。 –

+0

me〜= corrected。ありがとう! – hometoast

0

正規表現を組み合わせることができるすべての異なる方法を処理するためには、そのようなツールは非常に複雑でなければならないと私は非常に疑います。

例のように、正規表現が比較的シンプルな場合は、独自の書き方があるかもしれません。

2

理論上、正規表現は(非決定的な)有限状態オートマトンです。したがって、これらを統合して最小化することができます。 thisを出発点としてご覧ください。

これは最も正しい答えではないかもしれないことに注意してください。なぜ数千の正規表現に対処しなければならないのですか?私はそのようなことの支配地獄をただ見極めることができます。おそらく、パーサと文法を書くことを検討すべきでしょう - (そして、文法は正規表現よりも強力です)。

+0

一部の正規表現エンジンには、任意のネストされたかっこのようなDFAで実装できない機能が含まれています。このアプローチをとる前に、正規表現が実際にDFAに変換できるようにして、NFAと結合してからDFAに変換して最小化できるようにしてください。 – Techrocket9

関連する問題