RegEx用于拆分命令行参数

时间:2012-02-11 19:03:23

标签: java regex command-line-arguments

我有一个简单的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。

4 个答案:

答案 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;        
}