Как не сопоставить персонажа в группе захвата - PullRequest
2 голосов
/ 13 октября 2019

У меня есть захватывающий grp, пронумерованный 2, который ловит число, но мне нужно регулярное выражение, чтобы соответствовать всему, кроме того, что находится в \ 2 Я пытался [^ \ 2], но он все еще соответствует

Регулярное выражение:

##[^\n]*\n## \(CR (\d)\) RM (\d): [^\n]*\n##[^\n]*\n\(CR \1\) SM \2: [^\n]*\n(##[^\n]*\n\(CL **[^\2]**\) RM \2: [^\n]*\n)+

Текст:

(Комната чата 1) Получено сообщение от клиента 4: Приятно познакомиться!

(CR 1) РМ 4: Приятно познакомиться!

(Комната чата 1) Отправлено сообщение всем подключенным клиентам, кроме клиента 4: Приятно познакомиться!

(CR 1) SM 4: Приятно познакомиться!

(Клиент 1) Получено сообщение от клиента 4: Приятно познакомиться!

(CL 3) RM 4: Приятно познакомиться!

(Клиент 1) Получено сообщение от клиента 4:Приятно познакомиться!

(CL 4) RM 4: Приятно познакомиться!

Я хочу, чтобы последние две строки не были сопоставлены

Демо

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Вы можете использовать отрицательный прогноз, а затем сопоставить цифру (?!\2)\d, чтобы не соответствовать последней строке

##[^\n]*\n## \(CR (\d)\) RM (\d): [^\n]*\n##[^\n]*\n\(CR \1\) SM \2: [^\n]*\n(##[^\n]*\n\(CL (?!\2)\d\) RM \2: [^\n]*\n)+

Regex demo

Какпоследняя группа - это группа с повторным захватом, вы также можете сделать ее не захватывающей (?:, если вам не нужна сама группа.

Повторение захваченной группы будет захватывать только значение последней итерации.

(?:##[^\n]*\n\(CL (?!\2)\d\) RM \2: [^\n]*\n)+
^^^

Regex demo

0 голосов
/ 13 октября 2019

Полагаю, что, возможно, выражение, похожее на,

##[^\n]*\n## \(CR (\d)\) RM (\d): [^\n]*\n##[^\n]*\n\(CR \1\) SM \2: [^\n]*\n((?!##[^\n]*\n\(CL \2\) RM \2: [^\n]*\n)##[^\n]*\n\(CL .*?\) RM \2: [^\n]*\n)+

может быть вполне подходящим для изучения, но я не уверен, что оно будет близко к тому, что вы имеете в виду.

Демо

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