如果我先调用scanner.hasNext,然后再调用scanner.next,我是否会扫描两次?

问题描述

如果我呼叫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仍会使用此类令牌,​​然后检查其是否匹配。因此,对于我的用例来说,它已经没有用了。