2012-02-11 4 views
2

У меня есть простое Java-приложение, которое является графическим интерфейсом для приложения командной строки, и у меня есть поле, где пользователь может добавлять дополнительные аргументы командной строки. Дело в том, что я хочу передать все аргументы в «файл параметров», который использует приложение CLI, но для этого мне нужно разбить каждый аргумент соответствующим образом.RegEx для разделения аргументов командной строки

Пример:

--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] название = My Title 1 [MATCH] - править [MATCH] дорожка: v1

Я не знаю, было это просто или нет, я пробовал несколько аргументов RegEx, но это было на моей голове.

Приложение CLI является mkvpropedit, между прочим.

+0

'--set title = test 1 --edit track: v1': Как вы разделите заголовок? – jpalecek

+5

Должно ли это быть регулярным выражением? Я бы попробовал Commons ClI http://commons.apache.org/cli/ –

+0

@jpalecek: для файла опций не нужны кавычки для заголовка, он фактически будет обрабатывать кавычки как литеральные кавычки. – ReX

ответ

0

Насколько я понимаю, вам просто нужно разделить строку, используя пробел в качестве разделителя. В этом случае выполните следующие действия: str.split("\\s+").

+0

Это не сработает, потому что некоторые аргументы могут иметь пробелы, такие как «--set title = My Title 1». – ReX

3

Я не понимаю, почему вам нужен регулярное выражение здесь ...

В случае, если вы не ограничены какое-либо требование, что я не понимаю, я действительно считаю, что для разбора GNU style параметров командной строки, нужно для использования утилиты GNU getopt, ее Java version в частности.

Если вы используете Maven использовать его boils down для добавления этого к вашему ПОМ:

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

Если не ограничивается Regex, то вы можете найти это 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;   
} 
Смежные вопросы