用双引号解析参数
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);
}
我在 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);
}