如何从字符串中扫描“参数”并省略空格?

Posted

技术标签:

【中文标题】如何从字符串中扫描“参数”并省略空格?【英文标题】:How to scan "arguments" from a String and leave out whitespaces? 【发布时间】:2019-01-23 12:49:01 【问题描述】:

我想让用户输入一个命令(例如:transact fromWallet toWallet 12.00),然后从Scanner 中获取不带空格的参数,并将它们传递给变量以使用它们调用特定的方法。我仍在研究它,但我设法在没有 Scanner 提供的方法的情况下从 inputString 中提取参数。 Scanner 太有问题了。它要求我进行 5 个输入,而我只需要 4 个,依此类推。什么是“更好的方法”?我的解决方案好吗?我最终这样做了(请告诉我代码中的“不良做法”):

课堂上的帮助方法:

public static String getNextArg(String s) 
    // get last char
    int cut = s.indexOf(" ");
    if (cut == -1)
        cut = s.length();

    // split arg
    String arg = s.substring(0, cut);

    return arg;


public static String getLeftOver(String s) 
    int cut = s.indexOf(" ");
    if (cut == -1)
        cut = s.length() - 1;

    s = s.substring(cut + 1);
    return s;

主命令部分:

  String cmd = "";
    String arg1, arg2, arg3, arg4;

    System.out.println("Type your command!");
    Scanner cmdScanner = new Scanner(System.in);
    do 
        cmd = cmdScanner.nextLine();

        // Check for "exit"
        if (cmd.length() >= 4)
            if(cmd.substring(0, 4).equalsIgnoreCase("exit"))
                System.exit(0); // Is this a good way to exit a program?

        System.out.println("The args passed to cmd are: ");
        if (!cmd.trim().isEmpty()) 
            arg1 = getNextArg(cmd);
            cmd = getLeftOver(cmd);
            System.out.println("arg1 = " + arg1);
        
        if (!cmd.trim().isEmpty()) 
            arg2 = getNextArg(cmd);
            cmd = getLeftOver(cmd);
            System.out.println("arg2 = " + arg2);
        
        if (!cmd.trim().isEmpty()) 
            arg3 = getNextArg(cmd);
            cmd = getLeftOver(cmd);
            System.out.println("arg3 = " + arg3);
        
        if (!cmd.trim().isEmpty()) 
            arg4 = getNextArg(cmd);
            cmd = getLeftOver(cmd);
            System.out.println("arg4 = " + arg4);
        
        System.out.println("Type your command!");
     while (cmdScanner.hasNext());

结果符合我的预期。我只想知道如何使用Scannernext() 方法来做到这一点。这可能会有所帮助,因为稍后我想以适当的方式获得“下一个”BigDecimal,而对于像我这样的菜鸟来说,为所有事情实现自己的方法会有点多。

【问题讨论】:

cmdScanner.nextLine().split(" "); 是的,但是我需要使用一个数组。我想将“参数”分配给字符串。 你到底想做什么?请提供具有预期输出的示例输入。 这可能会有所帮助,因为稍后我想以适当的方式获得“下一个”BigDecimal——这非常不清楚。 我想让用户输入这样的命令:transact fromWallet toWallet 12.00。然后应该调用一个方法,例如: transact(fromWallet, toWallet, new BigDecimal(12.00)); 最后一个参数将是一个 BigDecimal 我就是这样在我的代码中实现了 Money。通过为我的方法获取 arguments 的实现,我将无法以我认为的良好方式获取 BigDecimal 【参考方案1】:
public static void main(String... obj) 
    try (Scanner scan = new Scanner(System.in)) 
        final Pattern whiteSpace = Pattern.compile("\\s+");
        System.out.println("Type your command!");

        do 
            String[] args = whiteSpace.split(scan.nextLine().trim());

            if (args.length == 1 && "exit".equalsIgnoreCase(args[0]))
                return;

            for (int i = 0; i < args.length; i++)
                System.out.println("arg" + (i + 1) + " = " + args[i]);

            System.out.println("Type your command!");
         while (scan.hasNext());
    

【讨论】:

感谢您的快速解决方案。它“几乎”有效。如果没有空格,它会失败。这意味着如果我只输入一个参数。 相同。仅当我输入单个“参数”时才会出现问题。表示没有空格。我试图了解“模式”和“匹配器”是如何工作的。您的解决方案看起来好多了。我唯一的问题是:我怎样才能重用“参数”?我的最终目标是将它们作为参数放入方法中,用户将使用另一个输入进行定义。 是的。所以看来你可以改用str.split() do之后的行改为String arguments[] = whiteSpace.split(scan.nextLine().trim());现在它完美地工作了。非常感谢!

以上是关于如何从字符串中扫描“参数”并省略空格?的主要内容,如果未能解决你的问题,请参考以下文章

如何扫描Android APK依赖的Jar包中哪些文件包含指定字符

如何省略字符串的点、逗号和空格(检查回文时需要)

如何使用扫描仪在java中将输入作为带有空格的字符串

xpath 去除空格

如何使用扫描仪在hackerrank中输入以空格分隔的字符

Perl - 如何从文本文件中省略行?