2012-02-11 119 views
2

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

基本上,我需要一个正则表达式将匹配这样的: --set [MATCH]标题=我的标题1 [赛事] - 编辑[MATCH] track:v1

我不知道这是否简单,我尝试了几个正则表达式的参数,但它超过了我的头。

顺便提一句,CLI应用程序是mkvpropedit。

+0

'--set title = test 1 --edit track:v1':你怎么划定标题? – jpalecek 2012-02-11 19:06:36

+5

它是否必须是正则表达式?我会尝试Commons ClI http://commons.apache.org/cli/ – 2012-02-11 19:09:04

+0

@jpalecek:选项文件不需要引用标题,它实际上将引号视为文字引号。 – ReX 2012-02-11 19:33:59

回答

0

据我所知,你只需要使用空格分隔字符串作为分隔符。在这种情况下,请执行以下操作:str.split("\\s+")

+0

这不会工作,因为一些参数可以有空格,如“--set title = My Title 1”。 – ReX 2012-02-11 19:22:58

3

我不明白为什么你需要这里的正则表达式...

如果你没有一些要求,我不明白,我真的觉得解析需要GNU style命令行选项的限制使用GNU实用程序getopt,特别是其Java version

如果你使用Maven的它boils down使用来添加以下内容到POM:

<dependency> 
    <groupId>gnu.getopt</groupId> 
    <artifactId>java-getopt</artifactId> 
    <version>1.0.13</version> 
</dependency> 
2

如果不是受限于正则表达式,那么你会发现这个command line argument parsing有用的达到你想要的东西。它提供比正则表达式更好的方式来做这件事。

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