根据Java API Scanner使用分隔符将整个输入分解为令牌。我试图理解令牌和分隔符。我正在做这个程序并且遇到了困惑
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner s = null;
try {
s = new Scanner(System.in);
s.useDelimiter("A");
System.out.println("1 " + s.next().length());
System.out.println("2 " + s.next().length());
System.out.println("3 " + s.next().length());
System.out.println("4 " + s.next().length());
} finally {
if (s != null) {
s.close();
}
}
}
}
当我使用输入AAAAAasdf
时,我得到以下输出。
1 0
2 0
3 0
4 0
我可以理解这个输出,因为在分隔符之间令牌的长度为零,因此所有都为零,但是当我使用默认分隔符并将输入作为
时 _____aaa\n
- >用空格替换下划线,然后点击我在eclipse控制台中输入\n
。
为此,我将输出作为
1 3
我无法理解。我给了5个空格,所以它们之间应该有4个长度为0的标记。为什么不?我在这里缺少什么?
答案 0 :(得分:7)
useDelimiter采用正则表达式模式。默认模式是
private static Pattern WHITESPACE_PATTERN = Pattern.compile(
"\\p{javaWhitespace}+");
将匹配任意数量的连续空格。如果你想要分隔符匹配任何数量的连续A尝试类似
s.useDelimiter("[A]+");
阅读以下内容:http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#useDelimiter(java.lang.String) http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#reset()
答案 1 :(得分:0)
当我们在代码中指定“”(空格)作为分隔符时,真的很有趣
try {
s = new Scanner(System.in);
s.useDelimiter(" ");
System.out.println("1 " + s.next().length());
System.out.println("2 " + s.next().length());
System.out.println("3 " + s.next().length());
System.out.println("4 " + s.next().length());
} finally {
if (s != null) {
s.close();
}
}
,输入
[5 spaces]asdf
我们看到输出
1 0
2 0
3 0
4 0
但是当我们不指定分隔符时,
try {
s = new Scanner(System.in);
//s.useDelimiter(" ");
System.out.println("1 " + s.next().length());
System.out.println("2 " + s.next().length());
System.out.println("3 " + s.next().length());
System.out.println("4 " + s.next().length());
} finally {
if (s != null) {
s.close();
}
}
相同的输入
[5 spaces]asdf
生成不同的输出
1 4
所以,我认为指定分隔符,即使默认分隔符使扫描程序跳过所有空标记。
答案 2 :(得分:0)
Scanner.next()
函数查找并返回此扫描程序中的下一个完整标记。在完成令牌之前和之后是与delimiter pattern
匹配的输入。默认模式为\\p{javaWhitespace}+
。
为了更好地理解它,请尝试使用etting delimiter "\\s*"
:
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\\s*");
while(scanner.hasNext())
System.out.println(scanner.next());
对于输入123
,scanner.next()
将打印:
1 // first println
2 //snd println
3 // third println
正如X*
所说,模式X
可以零或更多次。此表达式称为Quantifiers。但表达式X+
表示X, one or more times
。因此,请尝试使用分隔符"[A]+"
,该分隔符表示"A"
出现一次或多次,并匹配任意数量的连续"A"