2012-02-07 75 views
1

我在這裏問的應該是相當普遍的,但我的意圖是找出最好的方法來做到這一點。正則表達式在使用Java的文件中搜索

  • 我有一個目錄中的文件列表(如n) - 所有這些文件都有 已被分類分類。
  • 我有一個包含正則表達式模式(比如m)的csv文件,我想在特定類型的所有文件中查找它們。
  • 我想要有一個最終輸出,其中我列出了一個正則表達式模式,文件名, 行和行號。

以下是關於我應該如何處理這個我有幾個問題:

  1. 有沒有一種方法,我可以避開m * n個操作?
  2. 速度更快 - 在搜索所有正則表達式前,讀取文件,緩衝內容並將每行存儲在數組中,或者我應該採用正則表達式模式,逐行讀取文件並按照我解析的方式搜索,而不使用up內存?
  3. 我認爲讀/寫操作是最重要的 - 因此,我希望'n + 1'讀取(文件,csv),最後只需一次寫入。我的假設和方法是否正確?
  4. 陣列,列表,hashmaps,別的東西 - 任何建議什麼是完成任務的最佳方式?我認爲解析文件會是效率的關鍵嗎?
  5. 我可以使用哪些特殊的「不常見」Java API來顯着減少代碼?

我很感謝任何有關這個問題的見解/幫助。

+0

http://stackoverflow.com/questions/6222659/java-grep-library,但是meh - 爲什麼不只是使用grep? – 2012-02-07 00:36:37

回答

4

先寫一個簡單的工作解決方案,然後優化它。也就是說,我認爲你可以做類似的事情:

  • 從你正在搜索的每個單獨的正則表達式構造一個複合正則表達式。如果他們不使用捕獲模式,我懷疑你可以做一些像"(regex1)|(regex2)|(regex3)"這樣的事情,這是有效的。但我並不積極 - 我從來不清楚正則表達式捕獲組是如何在不同的|分支中工作的。
  • 使用Pattern.compile(regexString)預編譯正則表達式,因此它不會重建多次。
  • 使用番石榴的Files.toString(File, Charset)只是一口氣把每個文件一齊。如果你熱衷於逐行操作,請使用Files.readLines(File, Charset)獲得List<String>。您甚至可以使用全面的基於回撥的Files.readLines(File, Charset, LineProcessor)來避免一次將整個文件存儲在內存中。
  • 使用已編譯的Pattern來匹配目標文件 - 您可能需要使用Matcher來確定匹配的確切位置以及匹配的模式。
+0

複合正則表達式不適用於我,因爲我希望輸出也捕獲匹配的正則表達式模式。還是有辦法? – Prasoon 2012-02-07 01:13:17

+1

...可能會有,但這會很棘手。超級棘手。在這一點上,我建議繼續使用獨立匹配每種模式的'n * m'解決方案,然後查看它是否足夠滿足您的需求。如果沒有,請繼續嘗試深層次的黑客 - 可能通過計算出哪種模式是「正則表達式編號___」的「外部模式」。 – 2012-02-07 01:14:34