2012-02-07 16 views
1

ここで私が聞いているのはかなり一般的なはずですが、私の意図はそれを行う最良の方法を理解することです。正規表現でJavaを使用してファイルを検索

  • は、私はファイルのリストを持っているディレクトリ内の(nは言う) - すべてが は拡張子によって分類されています。
  • 私は、特定のタイプのすべてのファイルで検索したい正規表現パターン(mなど)を含むcsvファイルを持っています。
  • 私はRegexパターン、ファイル名、 行と行番号が記載されている最終的な出力を得たいです。ここで

私はこのアプローチすべきかについて私が持っているいくつかの質問です:

  1. は私がm * n個の操作を避けることができ方法はありますか?
  2. ファイルを読み込み、コンテンツをバッファリングし、各行をすべての正規表現の検索前に配列に格納するか、正規表現パターンを取るべきか、ファイルを1行ずつ読み込み、検索せずに検索しますアップメモリ​​?
  3. 私は読み取り/書き込み操作が最も課税対象であることを理解しています。したがって、最後にn + 1個の読み取り(ファイル、csv)と1回だけの書き込みが必要です。私の前提とアプローチは正しいのでしょうか?
  4. 配列、リスト、ハッシュマップ、何か他のもの - タスクを完了させる最良の方法は何ですか?私は、ファイルを解析することが効率の鍵となると思いますか?
  5. コードを大幅に削減できる「珍しい」Java APIはどれですか?

私はこの質問に関する洞察力/助けを感謝します。

+0

http://stackoverflow.com/questions/6222659/java-grep-libraryでも、grepを使用しないのはなぜですか? –

答えて

4

まず簡単な解決策を書いてください。次にを最適化してください。

  • あなたが探している個々の正規表現のそれぞれからの複合正規表現を構築する:それは言った、私はあなたのような何かを行うことができるかもしれないと思います。彼らがキャプチャパターンを使用していない場合、私は"(regex1)|(regex2)|(regex3)"のような何かをすることができ、それが有効であると思う。しかし私は正直ではありません - 正規表現のキャプチャグループが別の|ブランチに入っているときにどのように動作するかは決して分かりません。
  • Pattern.compile(regexString)を使用して正規表現をプリコンパイルすると、正規表現は2回以上再構築されません。
  • グアバのFiles.toString(File, Charset)を使用すると、各ファイルを一度にスラーすることができます。あなたがそれをラインごとに行うことに熱心であれば、Files.readLines(File, Charset)を使ってList<String>を入手してください。一度にメモリ内にファイル全体が存在しないようにするには、本格的なコールバック(Files.readLines(File, Charset, LineProcessor))を使用することもできます。
  • コンパイルされたPatternを使用してターゲットファイルと照合します。正確に一致した場所と一致したパターンを特定するには、おそらくMatcherを使用する必要があります。
+0

コンポジット正規表現は、一致する正規表現パターンをキャプチャして出力したいので、私にとってはうまくいかないでしょう。または方法がありますか? – Prasoon

+1

...可能性がありますが、それは難しいでしょう。スーパートリッキー。この時点では、それぞれのパターンに個別にマッチする「n * m」ソリューションを進めて、それがあなたのニーズに十分に速いかどうかを確認することをお勧めします。そうでない場合は、 "regex number ___"に対応する "外側パターン"がどのパターンであるかを調べることで、深刻なハッカーを試してみてください。 –