Попробуйте POLL\s+([ADM]{10})\s+((yes|no)(\s+([a-z. ]+))?)
- мы добавляем новую группу для (yes|no)
. Его номер будет 3, а группа причины - 5. Вы сопоставляете необязательный текст после yes
, но игнорируете его, что, я думаю, должно быть в порядке.
EDIT:
Вставив знак доллара $
после yes
, вы предотвратите совпадение, если после yes
: POLL\s+([ADM]{10})\s+((yes$|no)(\s+([a-z. ]+))?)
РЕДАКТИРОВАТЬ 2 (в ответ на @TristanDiaz):
Я бы не стал ставить на это свою жизнь, но боюсь, то, что вы желаете, невозможно, по крайней мере, с помощью стандартного регулярного выражения. С одной стороны, вы хотите, чтобы no
и объяснения после него всегда собирались вместе. Это означает объединение в регулярном выражении. С другой стороны, вы хотите захватить только yes
или no
в одну из ваших групп, для чего необходимо как-то разбить строку no
после строки. Вы не можете иметь это обоими способами одновременно. Вам нужно будет либо сделать что-то за пределами регулярного выражения (например, захватить no
и текст после него в одну группу и разделить его с помощью обычных строковых функций вне регулярного выражения), либо выбрать группу захвата, из которой нужно взять да / нет текста в зависимости от условия. В любом случае вам нужен внешний код.
Регулярные выражения имеют определенную выразительную силу, и не все могут быть выражены с их помощью. Например, такие простые выражения, как «n A-символов, за которыми следуют n B-символов» или «арифметическое выражение с правильными вложенными скобками», невозможно выразить с помощью регулярных выражений.
Если бы это было практическим заданием, я бы предложил вообще не использовать регулярное выражение, а скорее разбивать входную строку на первые N пробелов и проверять каждую часть отдельно, используя обычный код.