解析器的缓冲区如何工作?匹配正则表达式

时间:2014-04-01 10:23:47

标签: java regex

我的一个学生要完成的任务是检查文件中是否存在正则表达式匹配字符串。 诀窍是他的老师禁止立即阅读整个文件然后解析它。相反,他说他应该使用缓冲区。 问题是你永远不知道你想从文件中读取多少输入:如果你只从文件中读取一个字符,可能会有一个匹配的序列。

所以老师写了(翻译): 使用解析器已知的技术:

  1. 将缓冲区的后半部分重写为缓冲区的第一部分
  2. 将下一部分文件读到下半部分
  3. 检查整个缓冲区是否包含匹配序列
  4. 那么它应该如何完成(想法)?在我看来,它并没有解决上述问题,而且非常愚蠢和浪费。

2 个答案:

答案 0 :(得分:2)

当然,Matcher确实使用了某种内部缓冲区。但是如果你看一下构建Matcher的原型,你就会发现它作为一个参数唯一需要的是一个简单的CharSequence,它只有三个操作:

  • 知道它的长度,
  • 在给定的偏移处获得一个字符,
  • 获得一个子序列(另一个CharSequence)。

从文件中读取时,一种可能性是使用FileChannel.map()映射整个文件,然后使用适当的CharsetDecoder读取CharBuffer(实现CharSequence)。或者以大块的方式做到......

...或者使用你真正的疯狂想法:this!我已经在800多个MiB文件上进行了测试,它可以工作......

答案 1 :(得分:1)

老师在说什么:

  • 正则表达式永远不需要匹配长度超过缓冲区长度一半的任何内容。
  • 匹配可能位于缓冲区边界,因此您需要转移:

这看起来很现实。

BufferedReader读取线条看起来并不完全合适。也许你可以考虑一个字节数组,BufferedInputStream。