扫描程序Java混乱中的分隔符

时间:2013-11-06 17:42:51

标签: java java.util.scanner

根据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的标记。为什么不?我在这里缺少什么?

3 个答案:

答案 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());

对于输入123scanner.next()将打印:

1  // first println
2  //snd println
3 // third println

正如X*所说,模式X可以或更多次。此表达式称为Quantifiers。但表达式X+表示X, one or more times。因此,请尝试使用分隔符"[A]+",该分隔符表示"A"出现一次或多次,并匹配任意数量的连续"A"