Я анализирую вывод чата, чтобы получить имя пользователя. Вот как могут выглядеть результаты:
<Darker> MC_BOT sethome
(From Darker): MC_BOT exit
Мне нужно сопоставить имя пользователя и содержимое команды в строке. Взять эти данные из обеих строк легко:
^(<([A-Za-z0-9_]+)>|\\(From ([A-Za-z0-9_]+)\\):) MC_BOT ([a-z]+)( [a-zA-Z0-9 ]+)?$
|<Darker> |(From Darker): |sethome
Проблема в том, что для <Darker>
поле вывода 2 используется, но для (From Darker)
парсер использует поле 3.
<Darker> MC_BOT command parameters
1: <Darker>
2: Darker - field 2!
3:
4: command
5: parameters(From Darker): MC_BOT command parameters
1: (From Darker):
2:
3: Darker - field 3!
4: command
5: parameters
Итак, как мне написать это регулярное выражение, чтобы оно содержало имя пользователя в том же поле? Кроме того, могу ли я сделать регулярное выражение игнорировать (...|...)
? Мне нужно только соответствовать имени пользователя, а не <username>
или же (From username):
,
Boost, кажется, поддерживает сброс ветки. Таким образом, вы можете использовать что-то вроде:
^(?|<([A-Za-z0-9_]+)>|\(From ([A-Za-z0-9_]+)\):) MC_BOT ([a-z]+)( [a-zA-Z0-9 ]+)?$
^ ^ ^ ^ ^
| \ group 1 \ also group 1 \ g.2 \ group 3
|
\ branch reset
Других решений пока нет …