我构建了一个正则表达式,我将其编译为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()方法的重要内容?
答案 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()
的原因。