正则表达式使用Java搜索文件

时间:2012-02-07 00:23:30

标签: java regex search

我在这里要求的应该是相当常见的,但我的目的是找出最佳方法。

  • 我有一个目录中的文件列表(比如说n) - 所有文件都有 按扩展名分类。
  • 我有一个包含正则表达式模式(比如m)的csv文件,我想在特定类型的所有文件中查找。
  • 我想要一个最终输出,其中我有一个正则表达式,文件名, 列出的行号和行号。

以下是我应该如何解决这个问题的几个问题:

  1. 有没有办法避免m * n操作?
  2. 什么更快 - 在搜索所有正则表达式之前读取文件,缓冲内容并将每行存储在数组中,或者我应该采用正则表达式模式,逐行读取文件并在不使用时解析搜索记忆?
  3. 我认为读/写操作是最费力的 - 因此,我想要'n + 1'读取(文件,csv)并且最后只需要一次写入。我的假设和方法在这里是否正确?
  4. 阵列,列表,哈希映射,其他东西 - 关于什么是完成任务的最佳方式的任何建议?我认为解析文件是提高效率的关键吗?
  5. 我可以利用哪些特殊的“不常见”Java API显着减少代码?
  6. 感谢您对此问题的任何见解/帮助。

1 个答案:

答案 0 :(得分:4)

首先编写一个简单的工作解决方案,然后优化它。也就是说,我认为你可以做类似的事情:

  • 从您要搜索的每个正则表达式构造复合正则表达式。如果他们不使用捕获模式,我怀疑你可以做一些类似"(regex1)|(regex2)|(regex3)"的事情并且它是有效的。不过,我并不乐观 - 我从来都不清楚正则表达式捕获组在不同的|分支中如何工作。
  • 使用Pattern.compile(regexString)预编译正则表达式,使其不会重建多次。
  • 使用Guava的Files.toString(File, Charset)只是一次性啜饮每个文件。如果您热衷于逐行进行,请使用Files.readLines(File, Charset)获取List<String>。您甚至可以使用完整的基于回调的Files.readLines(File, Charset, LineProcessor)来避免将整个文件同时存储在内存中。
  • 使用已编译的Pattern与目标文件进行匹配 - 您可能需要使用Matcher来确定匹配的确切位置以及匹配的模式。