【问题标题】:How to use regex's to parse a file in Java?如何使用正则表达式解析 Java 中的文件?
【发布时间】:2011-02-10 08:21:07
【问题描述】:

我正在尝试使用一系列正则表达式来解析文件中的标记。我需要计算换行符并能够分隔它们之间没有空格的标记。不幸的是,java.util.Scanner 的 findWithinHorizo​​n() 方法在输入流的整个其余部分(直到地平线)搜索正则表达式匹配的 START,但我想匹配从当前文件位置开始的正则表达式。具体来说,我有一堆正则表达式,并希望遍历它们以查看从文件中 current 位置开始的匹配,然后在正则表达式匹配之后将文件位置推进到右侧,然后继续.这可能吗?

Scanner 的 next() 方法似乎对此毫无用处,因为它强制使用分隔符,并且正则表达式必须匹配整个令牌;我想从当前文件位置开始匹配,得到匹配的字符串,然后将文件搜索到匹配后。

【问题讨论】:

  • 这些文件有多大?可以一次性读入内存吗?

标签: java regex parsing expression match


【解决方案1】:

选项:

  1. 将整个文件作为字符串读入内存。然后在你想要的位置直接使用Matcher

  2. 使用从RandomAccessFile 获取的FileChannel 作为Scanner 的输入。然后您可以直接操纵通道的位置。

  3. 如上所述使用FileChannel,但直接使用Matcher 以获得更大的灵活性。

将 Matcher 与 RandomAccessFile 结合使用的示例:

FileChannel fc = file.getChannel();
fc.lock(); // so it doesn't change under you

ByteBuffer bb = ByteBuffer.allocate(BUFFER_SIZE);
CharBuffer cb = bb.asCharBuffer();

fc.read(bb);
Matcher matcher = pattern.matcher(cb);
// etc.

【讨论】:

  • 是的,我可以将文件读入内存。对于第二种方式,您将如何使用 Scanner 从当前位置匹配并且不使用分隔符?对于第一种和第三种方式,你如何告诉 Matcher 从当前位置开始,然后获取匹配的字符串并超越它进行下一次匹配?谢谢
  • @MMM - 你不能告诉Scanner 忽略分隔符,因为它的全部目的是找到分隔符。
  • @MMM - 可以用Matcher.region()控制匹配位置。
  • 要使用 Pattern.matcher() 我似乎需要一个 CharSequence。我无法在输入流上创建它,所以它似乎需要读取整个字符串。您将如何使用 FileChannel 或 RandomAccessFile 不必读取整个字符串?
  • @MMM - 如果您仍然希望能够匹配比缓冲区长度更长的字符串的正则表达式(不太可能),您可以实现自己的CharSequence,从引擎盖下的通道加载更多。
猜你喜欢
  • 2016-03-31
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多