10

根据 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-> 用空格替换下划线,然后\n在 Eclipse 控制台中按回车键。

为此,我得到的输出为

1 3

我无法理解。我给了 5 个空格,所以它们之间应该有 4 个长度为 0 的标记。为什么不?我在这里想念什么?

4

3 回答 3

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()

于 2013-11-06T17:59:06.117 回答
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

因此,我认为指定分隔符,即使默认分隔符会使扫描仪跳过所有空标记。

于 2013-11-06T17:59:49.977 回答
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可以出现次或多次。这个表达式被称为量词。然而一个表达式X+X, one or more times。所以尝试使用分隔符"[A]+",它表示"A"发生一次或多次,并匹配任意数量的连续"A"

于 2013-11-06T18:15:14.940 回答