如果我调用 scanner.hasNext 然后调用 scanner.next,我会扫描两次吗
Do I scan twice if I call scanner.hasNext and then scanner.next
如果我调用 scanner.hasNext(pattern)
然后在 java.util.Scanner
上使用相同的模式调用 scanner.next(pattern)
是否会扫描两次
假设我有很多案例的这段代码(试图制作词法分析器):
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 { ... }
慢还是快
- 或者是否有更简单的方法(无需第三方库)根据正则表达式模式进行分词
好的,所以我认为答案是:
文档没有说明任何可能,但也可能没有。
另外,我问这个问题主要是因为我想用它来解析更复杂的东西,比如字符串文字,而不仅仅是白色 space 分隔的标记。
并发现 Scanner 仍然采用此类令牌,然后检查它是否匹配。所以它现在对我的用例没用了。
如果我调用 scanner.hasNext(pattern)
然后在 java.util.Scanner
scanner.next(pattern)
是否会扫描两次
假设我有很多案例的这段代码(试图制作词法分析器):
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 { ... }
慢还是快
- 或者是否有更简单的方法(无需第三方库)根据正则表达式模式进行分词
好的,所以我认为答案是:
文档没有说明任何可能,但也可能没有。
另外,我问这个问题主要是因为我想用它来解析更复杂的东西,比如字符串文字,而不仅仅是白色 space 分隔的标记。 并发现 Scanner 仍然采用此类令牌,然后检查它是否匹配。所以它现在对我的用例没用了。