扫描仪 Java 混乱中的分隔符



根据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"