1

1.12GBディレクトリ内のすべてのログファイルでunixregEXPを実行してから、一致したパターンを。に置き換えようとしています''。4メガファイルでのテスト実行には約10分かかりましたが、機能しました。明らかに、何かがパフォーマンスに数桁の損害を与えています。

更新:^(155 [0-2])。* $の検索には、77件の一致がある5.6MBのファイルで約7秒かかることに気づきました。負の先読みアサーション?!を追加して、regExpが^(?! 155 [0-2])。* $になるようにすると、少なくとも5〜10分かかります。確かに、何千もの試合があります。

一致が多い場合、ネガティブな先読みアサーションはパフォーマンスに非常に悪影響を与える必要がありますか?

4

2 に答える 2

0

あなたが最初にそれを取り除くことができれば.*それは助けになるでしょう。その前に何がありますか、空白だけですか?もしそうなら、試してみてください:

^(?!\s*155[0-2][0-9]{4}\s).*$

それが本当に何かである可能性がある場合は、欲張りでないものにしてみてください。

^(?!.*?155[0-2][0-9]{4}\s).*$

注:どちらの例でも、3番目の例.*も同じものと一致するため、2番目の例を削除しました。

正規表現エンジンが実際に何をするかを考えるのに役立ちます。

  1. 一致^(行の先頭)。問題ない。
  2. 否定的な先読みアサーションと一致させてください
  3. で可能な限り取得し.*ます。これは、行全体を取得することを意味します。
  4. 次のキャラクターは1?そうでない場合は、.*一致する文字を1文字少なくし、一致するまで繰り返し1ます。

これは、一致しないすべての行について、行全体をバックトラックすることを意味していることがわかります。\s*さて、最初に使用するだけの場合、それは空白だけを取得し、行全体は取得しません。本当に何でもかまいませんが、パターンに.*?一致する行では高速になり、一致しない行ではほぼ同じになります。155(一致しない行では、.*行全体を取得するまで成長し続けます。)

于 2010-03-30T19:23:40.900 に答える
0

基本的に:使用している正規表現の実装は非線形であり、正規表現言語のサブセットのみを効率的に処理できます。背景については、機械で生成された正規表現を効率的に処理できる正規表現の実装に関する私の質問を参照してください。

別の実装を選択できる場合は、幸運です。私が探していたとき、これらは不足していました。2 つの妥当なオプションはRE2TREですが、どちらもライブラリであり、スタンドアロンの実行可能ファイルではありません。

もう 1 つのオプションは、以前に使用した UNIX ユーティリティ (grep?) を使用することです。grep には、他の多くの UNIX ユーティリティと同様に、確かに Windows ポートがあります。

于 2010-10-19T09:20:17.797 に答える