我正在读取一个具有这种模式的文件:(section1,section2,section3) ...
但格式无法保证,这意味着我必须处理诸如单独行上的一个部分、一行上的多个部分之类的情况。我还需要存储每个 token 的偏移量。所以我使用 Matcher 运行这样的代码,因为它提供了偏移量和标记:
`define a global matcher
while() {
readSection1(matcher, other parameters);
readSection2(matcher, other parameters);
readSection3(matcher, other parameters);
}
你可以看到我正在尝试通过这个匹配器,这样我就可以从我停止的地方开始。但现在我有一个问题。在我的最后一个 readSection3 方法结束后,我测试了我的匹配器没有到达末尾,所以我开始了新一轮的阅读。然而,当我再次进入 while 循环并将匹配器传递给我的 readSection1 方法时,匹配器突然结束了!为什么会发生这种情况?
我还进行了一些测试:
String loop = "a b c d e f g h i j k l";
Matcher loopMatcher = Pattern.compile("\\S+").matcher(loop);
boolean loopEnded = false;
while (!loopEnded) {
use(loopMatcher);
if (loopMatcher.hitEnd()) {
loopEnded = true;
}
}
public static void use(Matcher matcher) {
if (!matcher.find()) {
System.out.println("loop not ended but matcher hit end");
}
}
它也会打印错误消息。为什么?!
好吧,奇怪的事情发生了,现在我再次运行这个小程序,错误消失了,但它仍然在我的大程序中。
如果匹配器找到的最后一个字符串位于输入的末尾,则 Matcher.hitEnd()
方法似乎会返回 true。因此,如果文件最后一部分之后有字符,Matcher.hitEnd()
将返回 false,即使它实际上是最后一部分。
但是,我运行了你的测试代码,它没有显示错误消息。您确定您发布的代码与您的测试相同吗?您使用的匹配器不是您首先初始化的匹配器(“loopMatcher”与“matcher”)。
我是一名优秀的程序员,十分优秀!