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

使用Java在文件中搜索正则表达式,java,regex,search,Java,Regex,Search,我在这里问的应该很普遍,但我的目的是找出最好的方法 我在一个目录中有一个文件列表(比如n),所有这些文件都有 已按扩展进行分类 我有一个包含正则表达式模式(比如m)的csv文件,我想在所有特定类型的文件中查找它 我想有一个最终输出,其中我有一个正则表达式模式,文件名, 列出行和行号 以下是我应该如何处理的几个问题: 有没有办法避免m*n操作 什么更快?读取文件、缓冲内容并在搜索所有正则表达式之前将每一行存储在数组中,或者我应该采用正则表达式模式,逐行读取文件并在解析时搜索而不占用内存 我认为

我在这里问的应该很普遍,但我的目的是找出最好的方法

  • 我在一个目录中有一个文件列表(比如n),所有这些文件都有 已按扩展进行分类
  • 我有一个包含正则表达式模式(比如m)的csv文件,我想在所有特定类型的文件中查找它
  • 我想有一个最终输出,其中我有一个正则表达式模式,文件名, 列出行和行号
以下是我应该如何处理的几个问题:

  • 有没有办法避免m*n操作
  • 什么更快?读取文件、缓冲内容并在搜索所有正则表达式之前将每一行存储在数组中,或者我应该采用正则表达式模式,逐行读取文件并在解析时搜索而不占用内存
  • 我认为读/写操作是最累人的-因此,我希望有'n+1'读取(文件,csv),并且在最后只有一次写入。我的假设和方法正确吗
  • 数组、列表、hashmaps,还有其他一些东西——关于完成任务的最佳方式有什么建议吗?我认为解析文件是提高效率的关键
  • 我可以使用哪些特别的“不常见”Java API来显著减少代码
  • 我感谢您对这个问题的任何见解/帮助


    .

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

    • 从正在搜索的每个正则表达式构造一个复合正则表达式。如果他们不使用捕获模式,我想你可以做一些类似于
      “(regex1)|(regex2)|(regex3)
      的事情,这是有效的。不过,我并不确定——我从来都不清楚正则表达式捕获组在不同的
      分支中是如何工作的
    • 使用
      Pattern.compile(regexString)
      预编译正则表达式,使其不会多次重建
    • 用番石榴一次就可以把每一个锉刀都磨光。如果您非常喜欢逐行操作,请使用获取
      列表。您甚至可以使用完整的基于回调的
      Files.readLines(File、Charset、LineProcessor)
      来避免将整个文件一次存储在内存中
    • 使用编译的
      模式
      与目标文件匹配——您可能需要使用
      匹配器
      来确定匹配的确切位置以及匹配的模式

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

    • 从正在搜索的每个正则表达式构造一个复合正则表达式。如果他们不使用捕获模式,我想你可以做一些类似于
      “(regex1)|(regex2)|(regex3)
      的事情,这是有效的。不过,我并不确定——我从来都不清楚正则表达式捕获组在不同的
      分支中是如何工作的
    • 使用
      Pattern.compile(regexString)
      预编译正则表达式,使其不会多次重建
    • 用番石榴一次就可以把每一个锉刀都磨光。如果您非常喜欢逐行操作,请使用获取
      列表。您甚至可以使用完整的基于回调的
      Files.readLines(File、Charset、LineProcessor)
      来避免将整个文件一次存储在内存中
    • 使用编译的
      模式
      与目标文件匹配——您可能需要使用
      匹配器
      来确定匹配的确切位置以及匹配的模式

    ,但是meh--为什么不使用grep?,但是meh--为什么不使用grep?复合正则表达式对我不起作用,因为我希望输出也能捕获匹配的正则表达式模式。或者有办法吗?…可能有,但会很棘手。超级狡猾。在这一点上,我建议继续使用独立匹配每个模式的
    n*m
    解决方案,然后看看这是否足够快,满足您的需要。如果不是,那么继续尝试深层黑客操作——可能是通过找出哪个模式是对应于“regex number\uuuuuuuu”的“外部模式”。复合regex对我不起作用,因为我希望输出也能捕获匹配的regex模式。或者有办法吗?…可能有,但会很棘手。超级狡猾。在这一点上,我建议继续使用独立匹配每个模式的
    n*m
    解决方案,然后看看这是否足够快,满足您的需要。如果没有,那么继续尝试深层黑客攻击——可能是通过找出与“regex number”对应的“外部模式”