我有一个简单的Java应用程序,它是一个命令行应用程序的GUI,并且有一个字段,用户可以在其中添加额外的命令行参数。问题是,我想将所有参数传递给CLI应用程序使用的"选项文件",但要做到这一点,我需要相应地拆分每个参数。
一个例子:
--edit info --set title=My Title 1 --edit track:v1 --set flag-default=0 --set flag-forced=0
必须成为
--edit
info
--set
title=My Title 1
--edit
track:v1
--set
flag-default=1
--set
flag-forced=0
我基本上需要一个与此匹配的RegEx:--set[MATCH]title=我的标题1[MATCH]--编辑[MATCH]音轨:v1
我不知道这是否简单,我尝试了几次RegEx的论点,但都超出了我的想象。
顺便说一下,CLI应用程序是mkvpropedit。
我不明白为什么这里需要regexp。。。
如果你不受我不理解的某些要求的约束,我真的认为要解析GNU风格的命令行选项,你需要使用GNU实用程序getopt
,尤其是它的Java版本。
如果你正在使用Maven,那么它可以归结为将其添加到你的pom:中
<dependency>
<groupId>gnu.getopt</groupId>
<artifactId>java-getopt</artifactId>
<version>1.0.13</version>
</dependency>
如果它不限于regex,那么您可能会发现这个命令行参数解析对实现您想要的功能很有用。它提供了比regex更好的方法来完成这项工作。
我也遇到了同样的问题。我真的不能把这个论点作为分隔符,因为那样我就不知道每个论点是什么了。我最终是这样做的:
/**
* This method takes the command line arguments and turns them back into a single string.
* Then it looks for argument identifiers and values. In my case the arguments were
* like --action (or the synonym -a), --properties (or -p), etc.
*
* I only needed the first letter of the argument for my purposes but you can adjust
* the regex pattern to return more of group(1) if you need it.
*
* @param args
*/
private HashMap<String,String> parseArguments(String[] args){
HashMap<String,String> rawArguments = new HashMap<String,String>();
String input = new String();
for(int i=0;i<args.length;i++){
input+=args[i]+" ";
}
Pattern pattern = Pattern.compile("-?-([A-z])[A-z]* (.*?)");
Matcher matcher = pattern.matcher(input);
String key=null;
String val=null;
int re=0;
int st=0;
while(matcher.find()){
st=matcher.start();
if(key!=null){
val=input.substring(re, st).trim();
rawArguments.put(key,val);
}
key=matcher.group(1);
if(!matcher.hitEnd()){
re=matcher.end();
}
}
val=input.substring(re).trim();
rawArguments.put(key,val);
return rawArguments;
}
据我所知,您只需要使用空格作为分隔符来分割字符串。在这种情况下,请执行以下操作:str.split("\s+")
。