Регулярное выражение для разбора строки параметра - PullRequest
0 голосов
/ 05 февраля 2009

Я использую Java matcher, чтобы попытаться сопоставить следующее:

@tag TYPE_WITH_POSSIBLE_SUBTYPE -PARNAME1=PARVALUE1 -PARNAME2=PARVALUE2: MESSAGE

TYPE_WITH_POSSIBLE_SUBTYPE состоит из букв с точками.

Каждый параметр должен состоять из букв, а каждое значение должно состоять из цифр / букв. Может быть 0 или более параметров. Сразу после последнего значения параметра следует точка с запятой, пробел, а остаток считается сообщением.

Все должно быть сгруппировано.

Мое текущее регулярное выражение (как литерал Java):

(@tag)[\\s]+?([\\w\\.]*?)[\\s]*?(-.*=.*)*?[\\s]*?[:](.*)

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

Я не так много работаю с регулярными выражениями, поэтому я всегда что-то напутал.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2009

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

Pattern p = Pattern.compile("@tag\\s+([^:]++):\\s*(.*)");
Matcher m = p.matcher(s);
if (m.find())
{
  String[] parts = m.group(1).split("\\s+");
  for (String part : parts)
  {
    System.out.println(part);
  }
}
System.out.printf("message: %s%n", m.group(2));

Первый элемент в массиве - это имя вашего ТИПА, а остальные (если они есть) - параметры.

1 голос
/ 05 февраля 2009

Попробуйте это (вам может понадобиться добавить дополнительный '\', чтобы он работал внутри строки.

(@tag)\s*(\w*)\s*(-[\w\d]*=[\w\d]*\s*)*:(.*)

Кстати, я высоко рекомендую этот сайт, чтобы помочь вам создавать регулярные выражения: RegexPal . Или еще лучше RegexBuddy ; это стоит $ 40, если вы планируете делать много регулярных выражений в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...