【问题标题】:How to use Scanner.useDelimiter in Java如何在 Java 中使用 Scanner.useDelimiter
【发布时间】:2010-09-10 19:43:12
【问题描述】:

谁能帮助我处理 java.util.Scanner 类?
我不知道如何使用分隔符方法。

输入:teamA-teamB 4-5

输出:teamA:teamB:4:-5

预期输出:teamA:teamB:4:5

我的一段代码:

public void readResult()
{
    String team1, team2;
    int goals1, goals2;
    Scanner scanner = new Scanner(System.in);
    scanner.useDelimiter("\\s*-\\s*");
    if (scanner.hasNext())
    {
        team1 = scanner.next();
        scanner.useDelimiter("\\d*-\\d*");
        if(scanner.hasNext())
        {
            team2 = scanner.next().trim();
            scanner.useDelimiter("-");
            if(scanner.hasNext())
            {
                goals1 = scanner.nextInt();
                scanner.useDelimiter("\\n");
                if(scanner.hasNext())
                {
                    goals2 = scanner.nextInt();
                    System.out.println(team1 + ":" +  team2 + ":" + goals1 + ":" + goals2);
                    scanner.close();
                    return;
                }
            }
        }
    }
    scanner.close();
    System.out.println("bad format");
}

【问题讨论】:

    标签: java java.util.scanner delimiter


    【解决方案1】:

    我个人会使用正则表达式和组匹配来执行此操作,但如果您要使用扫描器,请不要专注于使用分隔符,使用 hasNext(String)next(String) 方法来匹配和检索下一个模式.

    带有分组示例的正则表达式:

        String input  ="teamA-teamB 4-5";
        String team1, team2;
        int goals1, goals2;
    
        Matcher matcher = 
            Pattern.compile("(.*?)\\s*-\\s*(.*?)\\s*(\\d*)\\s*-\\s*(\\d*)")
            .matcher(input);
        if ( matcher.matches() ) {
            team1 = matcher.group(1);
            team2 = matcher.group(2);
            goals1 = Integer.parseInt(matcher.group(3));
            goals2  = Integer.parseInt(matcher.group(4));
            System.out.println(team1 + ":" +  team2 + ":" + goals1 + ":" + goals2);
        }
    

    【讨论】:

    • 谢谢,我会阅读正则表达式分组。您的示例完美运行。
    • 值得一读以确保您理解代码,但它的一般要点是括号outer(inner regex)outer regex 允许您提取匹配的某些部分以供以后使用。举个简单的例子,输入为"hayneeeeeeedlestack" 的正则表达式"hay(nee+dle)stack" 将存储在第1 组"neeeeeeedle" 中。
    • 另外我不确定您的确切输入格式和错误处理要求,正则表达式可能需要调整(例如,它可能需要 (.+?) 而不是 (.*?) 以确保 team1 不为空)。
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 2022-01-22
    • 2014-04-12
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2013-02-20
    • 2014-12-09
    相关资源
    最近更新 更多