Джава. Регулярное выражение. Как разбирать? - PullRequest
1 голос
/ 17 ноября 2011

В качестве входных параметров у меня может быть два типа String:

codeName=SomeCodeName&codeValue=SomeCodeValue

или

codeName=SomeCodeName 

без codeValue.

codeName и codeValue это ключи.

Как я могу использовать регулярное выражение для возврата значений ключа?В этом примере он вернул бы только SomeCodeName и SomeCodeValue.

Ответы [ 3 ]

5 голосов
/ 17 ноября 2011

Я бы не стал использовать регулярные выражения для этого. String.split с простыми токенами ('&', '=') выполнят эту работу.

String[] args = inputParams.split("&");
for (String arg: args) {
    String[] split = arg.split("=");
    String name = split[0];
    String value = split[1];
}
3 голосов
/ 17 ноября 2011

Рассмотрите возможность использования разветвителя Guava's

String myinput = "...";
Map<String, String> mappedValues = 
           Splitter.on("&")
                   .withKeyValueSeparator("=")
                   .split(myinput);
1 голос
/ 17 ноября 2011

Простой способ - сначала разбить строку источника, а затем запустить 2 отдельных регулярных выражения для 2 частей.

Pattern pCodeName = Pattern.compile("codeName=(.*)");
Pattern pCodeValue = Pattern.compile("codeValue=(.*)");

String[] parts = str.split("\\&");
Matcher m = pCodeName.matcher(parts[0]);
String codeName = m.find() ? m.group(1) : null;

String codeValue = null;
if (parts.length > 1) {
    m = pCodeValue.matcher(parts[1]);
    codeValue = m.find() ? m.group(1) : null;
}

}

Но если вы хотите, вы также можете сказать:

Pattern p = Pattern.compile("codeName=(\\w+)(\\&codeValue=(\\w+))?");
Matcher m = p.matcher(str);

String codeName = null;
String codeValue = null;

if (m.find()) {
    codeName = m.group(1);
    codeValue = m.groupCount() > 1 ? m.group(2) : null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...