麻烦/困惑的Java.util.Scanner next(Pattern)方法

时间:2009-08-16 20:22:05

标签: java regex

我构建了一个正则表达式,我将其编译为Pattern以查找Fortran Real * 8数字。棘手的一点是,我正在读取的文件是一行,有几百万列。 当我这样做时:

Scanner recordScanner = new Scanner(recordString);
String foundReal = recordScanner.findInLine(real8Regex);

我得到了我正在寻找的东西,但是当我使用下一个(Pattern)方法时,我得到一个InputMismatchException ..奇怪,考虑到findInLine和下一个返回字符串。

Scanner recordScanner = new Scanner(recordString);
String foundReal = recordScanner.next(real8Regex);

我是否遗漏了使用next()方法的重要内容?

3 个答案:

答案 0 :(得分:3)

是否“并非所有令牌都与模式匹配,因此next(Pattern)卡在第一个不匹配的令牌”问题上?

next(Pattern)可以像这样使用:

String toSearch = "ab123d4e::g67f912g34h";
Scanner aScanner = new Scanner(toSearch);
aScanner.useDelimiter("[a-z]+");
while (aScanner.hasNext("[0-9]+"))
{
    System.out.println(aScanner.next("[0-9]+"));
}

但只会输出123和4,因为不匹配的第三个标记会导致while循环终止。但是,在这种情况下,我应该使用hasNext()next()代替。

我很难想到使用next(Pattern)的真正原因,因为它会卡在与模式不匹配的第一个令牌上。 next(Pattern) 表示“在与Pattern匹配的当前位置后返回第一个标记”;它意味着“如果匹配模式,则返回序列中的下一个标记;否则不执行任何操作”

您(可能)需要阅读所有令牌,因此最好使用hasNext()next(),然后针对所需的Matcher使用Pattern每个令牌

最后,您可能会发现question 842496有用

答案 1 :(得分:2)

在我看来,文档并没有出色地编写,但它正在做它的意图。

记录

next(pattern),如果在扫描仪的当前位置找到,则返回令牌。如果模式在当前行中不匹配,则会记录findInLine(pattern)以返回null

要先检查,请在致电hasNext(pattern)之前使用next(pattern)

答案 2 :(得分:1)

我有点迟了(你应该把它标记为“正则表达式”),但你应该使用

String foundReal = recordScanner.findWithinHorizon(real8Regex, 0);

通过使用findInline(real8Regex),您可以使扫描程序进行大量不必要的处理,以确保当前匹配与最后一个匹配在同一行。您的数据全部在一行中的事实正是您不应使用findInLine()的原因。