Объедините два результата регулярного выражения в одно поле вывода, если одновременно возможен только один

Я анализирую вывод чата, чтобы получить имя пользователя. Вот как могут выглядеть результаты:

<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):,

1

Решение

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
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]