Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 超大文件中的正则表达式搜索模式_Java_Regex - Fatal编程技术网

Java 超大文件中的正则表达式搜索模式

Java 超大文件中的正则表达式搜索模式,java,regex,Java,Regex,我想在由单行组成的非常大的文件(f.e大于1GB)中搜索模式。 无法将其加载到内存中。目前,我使用BufferedReader读取缓冲区(1024个字符)。 主要步骤: 将数据读入两个缓冲区 该缓冲区中的搜索模式 如果找到模式,则增加变量 将第二个缓冲区复制到第一个缓冲区 将数据加载到第二个缓冲区 两个缓冲区中的搜索模式 如果找到模式,则增加变量 重复上述步骤(从4开始),直到EOF 该算法(两个缓冲区)让我避免了这样的情况,即搜索的文本片段被块分割。它的工作原理类似于chram,除非模式结果小

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

  • 将数据读入两个缓冲区
  • 该缓冲区中的搜索模式
  • 如果找到模式,则增加变量
  • 将第二个缓冲区复制到第一个缓冲区
  • 将数据加载到第二个缓冲区
  • 两个缓冲区中的搜索模式
  • 如果找到模式,则增加变量
  • 重复上述步骤(从4开始),直到EOF
  • 该算法(两个缓冲区)让我避免了这样的情况,即搜索的文本片段被块分割。它的工作原理类似于chram,除非模式结果小于两个缓冲区的长度。例如,当结果更长时,我无法使用case进行管理—比方说长到3个缓冲区(但我只有两个缓冲区中的数据,所以匹配将失败!)。更重要的是,我能意识到这样一种情况:

  • 准备1 GB单行文件,包括“baaaaaaa(..)AAAAA B”
  • 搜索模式
    ba*b
  • 整个文件匹配模式
  • 我不必打印结果,我只需要说:“是的,我找到了模式”或“不,我找不到模式”。
  • java有可能吗?我的意思是:

  • 能够确定文件中是否存在模式(无需将整行加载到内存中,请参见上面的案例)
  • 当匹配结果比chunk长时,找到处理案例的方法

  • 我希望我的解释非常清楚。

    看来您可能需要将搜索模式分解为若干部分,因为考虑到您的限制,搜索整个搜索模式是失败的


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

    我认为解决方案是在非常大的文本文件上实现包装

    为什么?因为从
    模式构建
    匹配器
    需要
    字符序列
    作为参数

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



    编辑我冒了险,发现了“最糟糕的部分”是的,我正要自己写这个答案。如果你只需要知道它存在,试着找到开始。将数据加载到缓冲区,一旦你搜索到开始,一旦你开始搜索结束模式,根据需要将新数据加载到缓冲区。如果你在EOF之前找到结束模式,那么你的模式存在于文件.Hmm中。我能够确定当正则表达式可以使用时,缓冲区是否只包含匹配的开头。我不知道java是否可以。听起来不错。所以我需要找到一种方法,部分匹配模式(例如,仅从正则表达式和java开始)。如果你的搜索字符串像“ba*b”一样简单这应该不会太难。在遍历缓冲区时保持状态笔直会有点令人费解,当下一部分无法正确继续匹配时删除所有状态。这是一个有趣的问题。不幸的是,搜索字符串并不是那么简单。我的算法应该处理任何有效的正则表达式模式。嗯…如果Matcher不缓存字符,只对数组进行迭代。它可能是一个解决方案。好吧,也许是这样,还没有研究实现;)注意:还可以看看
    CharsetDecoder
    类,这将是一个非常有趣的想法。一个问题是,当试图查找匹配项时,
    Matcher
    会在正在搜索的字符串周围反弹(带有回溯等),这意味着多个缓冲区可能必须完全在内存中。@pwas吃了我自己的狗粮:--可能是其他人感兴趣的;)您熟悉Java的类吗?它看起来非常适合我。它有自己的缓冲,并正确处理您所说的匹配上的运行。