我有一个简单的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 = My Title 1 [MATCH] - 编辑[MATCH]曲目:v1
我不知道这是否简单,我尝试了几个RegEx参数,但它已经超出了我的想法。
顺便说一句,CLI应用程序是mkvpropedit。
答案 0 :(得分:3)
我不明白为什么你需要一个正则表达式...
如果您不受某些我不理解的要求的约束,我真的认为要解析GNU style命令行选项,您需要使用GNU实用程序getopt
,{{3}特别是。
如果您正在使用Maven Java version将其添加到您的pom:
<dependency>
<groupId>gnu.getopt</groupId>
<artifactId>java-getopt</artifactId>
<version>1.0.13</version>
</dependency>
答案 1 :(得分:2)
如果它不受限于正则表达式,那么您可能会发现这个command line argument parsing对于实现您想要的内容很有用。它提供了比正则表达式更好的方法来完成这些工作。
答案 2 :(得分:0)
据我所知,你只需要使用空格作为分隔符来分割字符串。在这种情况下,请执行以下操作:str.split("\\s+")
。
答案 3 :(得分:0)
我遇到了同样的问题。我不能把论点作为分界符分开,因为那时我不知道每个论点是什么。我最终这样做了:
/**
* 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;
}