【问题标题】:Delimiter in Scanner Java confusionScanner Java 混淆中的分隔符
【发布时间】:2013-11-06 17:42:51
【问题描述】:

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

【问题讨论】:

  • 我会假设扫描仪会跳过空格
  • @njzk2 它根据正则表达式模式工作。在评论中查看最受好评的答案和 API 参考。

标签: java java.util.scanner


【解决方案1】:

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

【讨论】:

【解决方案2】:

当我们在代码中指定“”(空格)作为分隔符时,看到它真的很有趣

    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

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

【讨论】:

    【解决方案3】:

    Scanner.next() function 从这个扫描器中查找并返回下一个完整的令牌。一个完整的标记前后是匹配delimiter pattern 的输入。默认模式为\\p{javaWhitespace}+

    为了更好地理解它,尝试设置分隔符"\\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"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 2013-11-10
      相关资源
      最近更新 更多