用双引号解析参数

Parsing arguments with double quotes

我在 Minecraft 中编写一个客户端,并且有一个命令管理器接受参数由 space 分隔的命令,例如 $command arg1 arg2 arg3.

// Message will output like "$command arg1 arg2" etc.
public void runCommand(String message) {
    String[] args = parseArgs(message);
}

// Accepts string, outputs array of arguments
public String[] parseArgs(String message) {
    return message.split(" ");
}

我尝试使用 str.split(" ") 函数通过 space 分隔参数。但是,问题是当我用双引号括起参数时,例如 $command "This is an argument",函数 returns 数组,例如 [$command, "This, is, an, argument"].

我如何解析这些参数以便输出 [$command, "This is an argument"]

这是正则表达式的工作!

java 这里有一个关于正则表达式的很好的通用教程:https://www.vogella.com/tutorials/JavaRegularExpressions/article.html

对于你的情况,我建议如下(代码尚未测试):

Pattern pattern = Pattern.compile("(\S+) |(\".+\")";
        // one or more non-whitespace characters or quotes around one or more characters
        Matcher matcher = pattern.matcher(message);
        // check all occurance
        while (matcher.find()) {
                String arg = matcher.group();
                // add it to an array 
        }

或者您可以通过对字符串中的字符进行 for 循环来执行此操作,但正则表达式是一种不错的方法。

试试这个。

static final Pattern ARG_PAT = Pattern.compile("\"[^\"]+\"|\S+");

public static String[] parseArgs(String message) {
    return ARG_PAT.matcher(message)
        .results()
        .map(r -> r.group())
        .toArray(String[]::new);
}