正则表达式搜索模式在非常大的文件中
我想在非常大的文件(超过1 GB)中搜索由单行组成的模式。 无法将其加载到内存中。 目前,我使用BufferedReader
读取缓冲区(1024个字符)。 主要步骤:
- 将数据读入两个缓冲区
- 在缓冲区中搜索模式
- 如果找到模式,则增加变量
- 将第二个缓冲区复制到第一
- 将数据加载到第二个缓冲区
- 在两个缓冲区中搜索模式。
- 如果找到模式,则增加变量
- 重复上述步骤(从4开始)直到EOF
该算法(两个缓冲区)让我避免情况,其中搜索的文本块被块分割。 它的作用就像一个chram,除非模式结果小于两个缓冲区的长度。 例如,我无法处理大小写,当结果更长时 – 让我们说多3个缓冲区(但我只有两个缓冲区中的数据,所以匹配将失败!)。 更重要的是,我可以实现这样的情况:
- 准备1 GB单行文件,其中包含“baaaaaaa(….)aaaaab”
- 搜索模式
ba*b
。 - 整个文件匹配模式!
- 我没有打印结果,我只能说:“是的,我能找到模式”或“不,我无法找到”。
用java可以吗? 我的意思是:
- 能够确定文件中是否存在模式(不将整行加载到内存中,请参见上述情况)
- 当匹配结果长于块时,找到处理大小写的方式。
我希望我的解释非常明确。
我认为你的解决方案是将CharSequence
实现为非常大的文本文件的包装器。
为什么? 因为从Pattern
构建Matcher
CharSequence
作为参数。
当然,说起来容易做起来难……但那时你只有三种方法可以实现,所以这不应该太难……
编辑我采取了暴跌,我吃了自己的狗的食物 。 “最糟糕的部分”是它确实有效!
看起来你可能需要将搜索模式分解成碎片,因为,鉴于你的限制,完全搜索它是失败的。
你能确定缓冲区是否包含匹配的开头 ? 如果是,请保存该状态,然后搜索下一部分以查找匹配的下一部分。 继续,直到找到整个搜索词。