2012-02-11 120 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;   
}