如果我调用scanner.hasNext,然后调用scanner.next,我会扫描两次吗



如果我在java.util.Scanner上用相同的模式调用scanner.hasNext(pattern)然后调用scanner.next(pattern),我会扫描两次吗

假设我有很多案例的代码(试图制作一个lexer(:

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 { ... }慢还是快
  • 或者有没有一种更简单的方法(没有第三方库(可以基于regex模式进行标记化

好的,所以我认为答案是:

文档中没有说明任何内容,所以这可能是可能的,但可能不是。


此外,我之所以这么问,主要是因为我想用它来解析更复杂的东西,比如字符串文字,而不仅仅是空格分隔的标记。发现Scanner仍然接受这样的令牌,然后检查它是否匹配。所以它现在对我的用例来说是无用的。

最新更新