Java - список параметров токенизации - PullRequest
1 голос
/ 25 января 2010

Я пытаюсь создать метод, который принимает параметр String, а затем возвращает двумерный массив String с именами и значениями параметров.

protected final String[][] setParams (String parms) {
    String[][] params;
    int i = 0;
    Pattern p = Pattern.compile(NEED_REGEX_HERE);
    Matcher m = p.matcher(parms);

    params = String[m.groupCount()][2];

    while (m.find()) {
        params[i][0] = m.group(i).subString(0,m.group(i).indexOf('='));
        params[i][1] = m.group(i).subString(m.group(i).indexOf('='));
        i++;
    }

    return params;
}

Некоторые примеры ввода будут (внутри кавычек):

"Name=Ryan;\;Name=John"
"Name=Ryan;Name=John"
"Name=Ryan"
"Name=Ryan;Index=1"

Итак, ";" является разделителем списка, а оператор присваивания "=" обозначает допустимый параметр, т.е. «\» - это выброшенное значение. По сути, я ищу регулярное выражение, которое позволило бы мне сделать это, или, если кто-то может предложить такое, более элегантное решение.

Ответы [ 4 ]

2 голосов
/ 25 января 2010

Если вам все еще интересно узнать версию регулярного выражения (я знаю, что вы уже отметили ответ) ... это будет выглядеть примерно так:

Pattern p = Pattern.compile( "(\\w+)=(\\w+);?" );
Matcher m = p.matcher( myString );
while( m.find() ) {
    System.out.println( "name[" + m.group(1) + "] = value[" + m.group(2) + "]" );
}

Это предполагает, что имена и значения состоят только из буквенных символов (буквенно-цифровых). Точка с запятой с «необязательным» квантификатором на самом деле в этом случае не нужна, так как она с радостью пропустит то, что не понимает.

1 голос
/ 25 января 2010

Для приведенных примеров должны работать два разбиения:

String[] keyValuePairs = line.split(";");
for (String keyValuePair:keyValuePairs) {
  if (isThrowAwayParameter(keyValuePair)) {
    handleThrowAwayParameter();
  } else {
    String[] keyAndValue = keyValuePair.split("=");
    String key = keyAndValue[0];
    String value = keyAndValue[1];
    handleKeyAndValue(key, value);
  }
}
0 голосов
/ 26 января 2010

Если имена параметров уникальны, вы можете использовать класс свойств:

Properties p = new Properties();
p.load(new StringReader(parms.replaceAll(";", "\n")));
0 голосов
/ 25 января 2010

В этом есть достаточно ошибок, поэтому вам лучше использовать заранее написанную библиотеку (например, синтаксический анализ форм «-h, --help, foo = bar» и т. Д. И т. Д.). Для этого создано множество библиотек. Быстрый поиск показал короткий список здесь .

Если вы действительно хотите написать это самостоятельно, я бы просто попытался разделить каждую опцию строки cmd на "=", с обильными и понятными сообщениями об ошибках для всех искаженных команд, которые вы получите.

...