正则表达式搜索模式在非常大的文件中

时间:2014-02-25 14:42:11

标签: java regex

我想搜索由单行组成的非常大的文件(f.e大于1 GB)中的模式。 无法将其加载到内存中。目前,我使用BufferedReader读入缓冲区(1024个字符)。 主要步骤:

  1. 将数据读入两个缓冲区
  2. 在缓冲区中搜索模式
  3. 如果找到模式,则增加变量
  4. 将第二个缓冲区复制到第一个
  5. 将数据加载到第二个缓冲区
  6. 在两个缓冲区中搜索模式。
  7. 如果找到模式,则增加变量
  8. 重复上述步骤(从4开始)直到EOF
  9. 该算法(两个缓冲区)让我避免情况,其中搜索的文本块被块分割。它的作用就像一个chram,除非模式结果小于两个缓冲区的长度。例如,我无法处理大小写,当结果更长时 - 让我们说多3个缓冲区(但我只有两个缓冲区中的数据,因此匹配将失败!)。更重要的是,我可以意识到这样的情况:

    1. 准备1 GB单行文件,即“baaaaaaa(....)aaaaab”
    2. 搜索模式ba*b
    3. 整个文件匹配模式!
    4. 我没有打印结果,我只能说:“是的,我能找到模式”或“不,我无法找到”。
    5. 用java可以吗?我的意思是:

      1. 能够确定文件中是否存在模式(不将整行加载到内存中,请参见上面的案例
      2. 当匹配结果长于块时,找到处理大小写的方式。
      3. 我希望我的解释非常明确。

2 个答案:

答案 0 :(得分:13)

我认为您的解决方案是将CharSequence实现为非常大的文本文件的包装。

为什么呢?因为从Matcher构建Pattern需要CharSequence作为参数。

当然,说起来容易做起来难......但是你只有三种方法可以实施,所以不应该太难......


编辑我冒险尝试了ate my own dog's food。最糟糕的部分"是它确实有效!

答案 1 :(得分:1)

似乎你可能需要将搜索模式分解成碎片,因为,鉴于你的限制,完全搜索它是失败的。

您能确定缓冲区包含匹配的开头吗?如果是,请保存该状态,然后搜索下一部分以查找匹配的下一部分。继续,直到找到整个搜索词。