根据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
我可以理解这个输出,因为分隔符之间的标记长度为零,因此所有标记均为零,但是当我使用默认分隔符并将输入作为
_____aaan
->将下划线替换为空格,n
由我在 eclipse 控制台中按回车键替换。
为此,我得到的输出为
1 3
我无法理解。我给了 5 个空格,所以它们之间应该有 4 个长度为 0 的标记。为什么不呢?我在这里错过了什么?
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()
当我们在代码中指定" "(空格)作为分隔符时,看到这真的很有趣
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
所以,我认为指定分隔符,即使默认的分隔符使扫描仪跳过所有空令牌。
Scanner.next()
函数 从此扫描程序查找并返回下一个完整令牌。完整的令牌前后是与delimiter pattern
匹配的输入。默认模式为 \p{javaWhitespace}+
。
为了更好地理解它,请尝试在"\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
可以发生零次或多次。此表达式称为量词。然而,X+
一个表达式说X, one or more times
.因此,请尝试使用分隔符"[A]+"
表示"A"
发生一次或多次,并匹配任意数量的连续"A"