当前位置: 首页 > 知识库问答 >
问题:

扫描器中的分隔符Java混淆

徐承载
2023-03-14

根据JavaAPI 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();
            }
        }
    }
}

当我使用输入AAAAasdf时,我得到以下输出。

1 0
2 0
3 0
4 0

我可以理解这个输出,因为分隔符之间的标记长度为零,因此所有标记都为零,但当我使用默认分隔符并将输入作为

<代码>\uuuuuuuaaa\n-

为此,我得到的输出为

1 3

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

共有3个答案

杨骁
2023-03-14

Scanner.next()函数查找并返回此扫描仪中的下一个完整标记。完整标记的前面和后面都有与分隔符模式匹配的输入。默认模式是\\p{javaWhitespace}

要更好地理解它,请尝试设置分隔符"\\s*"

Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\\s*");
while(scanner.hasNext())
  System.out.println(scanner.next());

对于输入123,它是扫描仪。next()将打印:

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

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

商嘉木
2023-03-14

很有意思的是,当我们在代码中指定“”(空白)作为分隔符时

    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

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

翁和颂
2023-03-14

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

 类似资料:
  • 问题内容: 我想为扫描器指定一个分隔符,该分隔符可以按某种模式进行拆分,但不会从令牌中删除该模式。我似乎无法完成这项工作,因为正则表达式所标识的所有内容也会作为分隔符的一部分被占用。有什么建议? 我的具体问题是,我的文件看起来像: 我想从文本/数字混合+行中分离出来,直到下一个文本/数字混合。我有正则表达式来标识它们,但是如上所述,因为定界符占用了我想要的内容,所以使用了它。 编辑:代码添加: 是

  • 我目前正在执行游戏风险。在我的Board课程中,我阅读了三个不同的文本文件,其中包括国家、大陆及其邻近地区。当我构建一个新大陆时,它的构造器需要以下内容(字符串名、int-bonusArmies、ArrayList-memberCountries)。现在,我用扫描器从一个文本文件中读取,这个文件是这样组织的,它的名字,它拥有的奖金军队,每行的其余部分是它的成员国。 北美、5、阿拉斯加、阿尔伯塔省、

  • 当我试图在Eclipse中运行我的程序时,我收到以下错误: 在java.util.scanner.throwfor(Scanner.java:864),java.util.scanner.next(Scanner.java:1485),java.util.scanner.nextInt(Scanner.java:2117),java.util.scanner.nextInt(Scanner.jav

  • 我有一个类,它创建多个对象,并将它们放入中,如下所示: 我有一个应用程序,它从控制台扫描输入“add”,如果找到,就调用方法,如下所示: 应用程序应该允许用户输入“add”,但在调用方法后,将出现错误“no line found”。 我猜这是因为方法中的没有关闭,然后在需要时重新打开。这是程序的问题吗?如果是,我该如何修复它? 请注意,这个程序还没有完成,因为我将添加一个出售这些股票的销售方法。这

  • 问题内容: 我正在编写一个使用Event类的程序,该类中有一个日历实例和一个String类型的描述。创建事件的方法使用扫描仪获取月,日,年,小时,分钟和说明。我遇到的问题是Scanner.next()方法仅返回空格之前的第一个单词。因此,如果输入为“我的生日”,则该事件实例的描述就是“我的”。 我做了一些研究,发现人们使用Scanner.nextLine()解决此问题,但是当我尝试这样做时,它只是

  • 我正在尝试编写一个应用程序,它将占用一个非常大的sql文本文件~60GB(2.57亿行),并将每个COPY语句拆分为单独的文本文件。 但是,我目前使用的代码会导致OutOfMemoryError,因为行超过了扫描仪缓冲区限制。第一个语句将是4000万行。 请提供建议,说明这是执行此操作的错误方法还是对现有方法的修改。 谢啦