用双引号解析参数

时间:2019-12-18 23:57:15

标签: java parsing arguments minecraft

我正在Minecraft中为客户端编写代码,并拥有一个命令管理器,该命令管理器接受带有空格分隔的参数的命令,例如$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(" ")函数以空格分隔参数。但是,问题是当我的参数用双引号引起来时,例如$command "This is an argument",该函数将返回一个数组,例如[$command, "This, is, an, argument"]

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

2 个答案:

答案 0 :(得分:1)

尝试一下。

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);
}

答案 1 :(得分:0)

这是正则表达式的工作!

这里有一个关于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循环来做到这一点,但是正则表达式是一种不错的方法。