2016-09-13 8 views
1

私は、約3000文字の長さのテキストブロックでマルチパイプRegexを実行しています。私は別の6を持っているし、試合はお互いに同じ順序に相対常にあり、それは、私はいつも、私はパターン1を見つけたテキストのブロックにテストしてい今、最後の1 firsstRegexで最適化またはパイプ(|)

Pattern1|Pattern2|Pattern3|Pattern4|Pattern5|Pattern6 

の優先順位を決定したいです複雑。スタンドアローンの場合は41ステップ、パイプの場合は30,000を要します。私は、この特定の問題についてより具体的な情報を得るかもしれないが、パイプやパイプをより効率的にするためのいくつかの一般的なステップがあるかどうか疑問に思っていました。助けとなる「注文」はありますか?明らかに、これは最初のパターンをテストしていないので終了します。まだ41ステップなので、私が気づいていない基本的なものや建設的なものを遵守する必要があるかどうか疑問に思っています。

+2

私は公平な最初の質問は、次のように推測します。なぜこの正規表現を使用していますか? – usr2564301

+0

はい、基本的なことはパターンが文字列の各位置(左から右)で各ブランチでテストされていることです(ブランチごとに文字列全体ではありません)。 –

+0

あなたの個々の正規表現がどのように関係しているかを完全に理解していませんが、それらを独立した検索に分割することはできますか?そうであれば、マルチプロセッシングモジュールを使用して、それぞれが用語のうちの1つだけを検索するワーカープロセスを設定できます。おそらく、後処理の結果によっては、必要なフォーマットに結果を整理することができます。私は与えられた正規表現をこれ以上単純化する方法を知らない。 – skrrgwasme

答えて

0

代替グループを最適化するための主なポイントは、です。別のブランチは、同じロケーションので一致しません。

の上にあなたのパターンのものと多くの類似した部分文字列を持っている文字列を考えてみましょう:

Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern2 

regex demoを参照してください。 Pattern1が最初に試され、Patternと一致しますが、その後に桁がないため、代替は破棄され、次の分岐が試行されます。 Pattern2も数字になりますが、数字はありません。等々。

正規表現を共通の接頭辞で開始し、別の末尾にグループを使用すると(例えば、Pattern(?:1|2|3|4|5|6))、多くの冗長バックトラックが不要になります。

関連する問題