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

8 java regex

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

  1. 将数据读入两个缓冲区
  2. 在缓冲区中搜索模式
  3. 如果找到模式,则增加变量
  4. 将第二个缓冲区复制到第一
  5. 将数据加载到第二个缓冲区
  6. 在两个缓冲区中搜索模式.
  7. 如果找到模式,则增加变量
  8. 重复上述步骤(从4开始)直到EOF

该算法(两个缓冲区)让我避免情况,其中搜索的文本块被块分割.它的作用就像一个chram,除非模式结果小于两个缓冲区的长度.例如,我无法处理大小写,当结果更长时 - 让我们说多3个缓冲区(但我只有两个缓冲区中的数据,因此匹配将失败!).更重要的是,我可以实现这样的情况:

  1. 准备1 GB单行文件,其中包含"baaaaaaa(....)aaaaab"
  2. 搜索模式ba*b.
  3. 整个文件匹配模式!
  4. 我不必打印结果,我只能说:"是的,我能找到模式"或"不,我无法找到".

用java可以吗?我的意思是:

  1. 能够确定文件中是否存在模式(不将整行加载到内存中,请参见上述情况)
  2. 当匹配结果长于块时,找到处理大小写的方式.

我希望我的解释非常明确.

fge*_*fge 13

我认为你的解决方案是实现CharSequence作为非常大的文本文件的包装器.

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

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


编辑我采取了暴跌,我吃了自己的狗的食物."最糟糕的部分"是它确实有效!

  • @pwas吃了我自己的dogfood:https://github.com/fge/largetext - 毕竟可能对别人感兴趣;) (4认同)