问题描述
如果我呼叫scanner.hasNext(pattern)
,然后呼叫scanner.next(pattern)
,并且在java.util.Scanner
上使用相同的模式,是否扫描两次?
import java.util.*;
import java.util.regex.Pattern;
public class MainClass {
public static void main(String[] args) {
Scanner scanner = new Scanner("Hello World! 3 + 3.0 = 6 ");
Pattern a = Pattern.compile("..rld!");
Pattern b = Pattern.compile("...llo");
while(scanner.hasNext()) {
if (scanner.hasNext(a)) {
scanner.next(a);
/*Do something meaningful with it like create a token*/
}
else if(scanner.hasNext(b)) {
scanner.next(b);
}
/*...*/
}
// close the scanner
scanner.close();
}
}
我的问题是:
-
hasNext(pattern)
是否以某种方式缓存了搜索结果?因此它不会两次搜索相同的模式 - 这比使用
try { scanner.next(pattern) } catch { ... }
慢还是快 - 或者有没有更简单的方法(没有第三方库)基于正则表达式模式进行标记化
解决方法
好的,我认为答案是:
文档没有说明任何内容,因此有可能,但可能没有。
此外,我主要是因为我想用它来解析更复杂的事物,例如字符串文字,而不仅仅是空格分隔的标记。 并发现Scanner仍会使用此类令牌,然后检查其是否匹配。因此,对于我的用例来说,它已经没有用了。