RegEx以拆分命令行参数



我有一个简单的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+")

最新更新