我正在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"]
?
答案 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循环来做到这一点,但是正则表达式是一种不错的方法。