Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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_Android_Html_String - Fatal编程技术网

Java 在长字符串中查找模式?

Java 在长字符串中查找模式?,java,android,html,string,Java,Android,Html,String,我有40KB的HTML页面,我想在其中找到某些模式 我可以按1K缓冲区读取它,但我希望避免我正在搜索的模式在两个缓冲区读取之间被分割的情况 如何克服这个问题?这很容易。计算要查找的最长模式,然后按该值回溯文件指针,或者滚动文件,只读取增量 想象一下最长的模式是26字节 读1k 检查所有模式->无 从缓冲区中删除1k-26字节 从流中读取1k-26字节并添加到缓冲区 转到2 编辑:让我澄清一下:有两种方法可以做到这一点,它们都有各自的优点。如果您是从一个流中读取数据,这意味着一个不支持查找的数据源

我有40KB的HTML页面,我想在其中找到某些模式

我可以按1K缓冲区读取它,但我希望避免我正在搜索的模式在两个缓冲区读取之间被分割的情况


如何克服这个问题?

这很容易。计算要查找的最长模式,然后按该值回溯文件指针,或者滚动文件,只读取增量

想象一下最长的模式是26字节

  • 读1k
  • 检查所有模式->无
  • 从缓冲区中删除1k-26字节
  • 从流中读取1k-26字节并添加到缓冲区
  • 转到2
  • 编辑:让我澄清一下:有两种方法可以做到这一点,它们都有各自的优点。如果您是从一个流中读取数据,这意味着一个不支持查找的数据源,那么最好使用我上面提到的方法。但是,如果您的数据源确实支持查找(如文件系统文件),那么您可以轻松地对查找执行相同的操作。检查图案,如果找不到,查找最长图案的大小,然后从那里开始


    但是,如果您想支持搜索长度超过缓冲区大小的模式,则可能需要一种更聪明的算法。当您继续读取更多数据时,您需要一个包含当前“打开”的所有模式的查找表,这反过来会消耗更多内存-您会遇到问题。

    这很容易。计算要查找的最长模式,然后按该值回溯文件指针,或者滚动文件,只读取增量

    想象一下最长的模式是26字节

  • 读1k
  • 检查所有模式->无
  • 从缓冲区中删除1k-26字节
  • 从流中读取1k-26字节并添加到缓冲区
  • 转到2
  • 编辑:让我澄清一下:有两种方法可以做到这一点,它们都有各自的优点。如果您是从一个流中读取数据,这意味着一个不支持查找的数据源,那么最好使用我上面提到的方法。但是,如果您的数据源确实支持查找(如文件系统文件),那么您可以轻松地对查找执行相同的操作。检查图案,如果找不到,查找最长图案的大小,然后从那里开始


    但是,如果您想支持搜索长度超过缓冲区大小的模式,则可能需要一种更聪明的算法。当您继续读取更多数据时,您需要一个包含当前“打开”的所有模式的查找表,这反过来会占用更多内存—您会遇到问题。

    您可以查看,它实现了此目的,它的实现就是为了这个目的

    这就是类的目的。

    这就是类的目的。

    为什么不使用。它是用来处理大文件的标记。如果您试图在同一级别的不同元素之间进行匹配,则只会遇到问题。但是,这并非不可能处理,为什么不使用。它是用来处理大文件的标记。如果您试图在同一级别的不同元素之间进行匹配,则只会遇到问题。然而,这并非不可能处理

    让我们希望他的最长字符串的长度不是1k-1:)好主意,但它只有在他搜索精确字符时才起作用。假设模式-一些html标记之间的所有内容。它的长度是不可预测的。如果长度是不可预测的,我当然会预测一个比他的缓冲区大的长度。这意味着他遇到了比他所知道的更多的麻烦:)让我们希望他的最长字符串的长度不是1k-1:)好主意,但只有当他搜索精确的字符时,它才起作用。假设模式-一些html标记之间的所有内容。它的长度是不可预测的。如果长度是不可预测的,我当然会预测一个比他的缓冲区大的长度。这意味着他遇到了比他所知道的更多的麻烦:)SAX解析器在错误的HTML语法上会失败,所以我不能使用它。SAX解析器在错误的HTML语法上会失败,所以我不能使用它。