Совпадение всех вхождений группы A, за которыми следуют две группы B, с дополнительными символами - PullRequest
2 голосов
/ 15 марта 2019

У меня есть строка со следующим «допустимым» шаблоном, который повторяется несколько раз: определенная группа символов, скажем «ab», любое количество других символов, скажем «xx», другая конкретная группа символов, скажем«cd», любое количество других символов, скажем «xx».

Итак, допустимая последовательность будет такой: «abxcdabxxcdabxcdxx»

Я пытаюсь обнаружить недопустимые последовательности этой конкретной формы:«abxxcdxxcd» и удалите средний «cd», чтобы сделать его действительным: «abxxxxcd»

Я пробовал следующее регулярное выражение:

/(?<=ab).*(cd).*(?=ab)/gsU

Это работает для одной последовательности, но этопроисходит сбой для следующей строки: «abxx cd xcdxxabxcdxxabx cd xxcd», которая содержит недопустимую последовательность, за которой следует допустимая последовательность, за которой следует другая недопустимая последовательность.Я хочу, чтобы обе группы были выделены жирным шрифтом.

Обратите внимание, что другие символы "xx" могут содержать что угодно, включая разрывы строк.Однако они никогда не будут содержать строки «ab» или «cd», за исключением указанного мной неверного регистра.

Вот соответствующая ссылка regex101: https://regex101.com/r/U9pRfo/1

Редактировать:

Ответ Виктора сработал для меня.Однако я получал PREG_JIT_STACKLIMIT_ERROR в php при использовании этого регулярного выражения для очень большой строки.В итоге я просто разбил эту строку на более мелкие части и перестроил строку после, что сработало отлично.

1 Ответ

1 голос
/ 15 марта 2019

Вы можете использовать

'~(?:\G(?!^)|ab)(?:(?!ab).)*?\Kcd(?=(?:(?!ab).)*?cd)~s'

См. Демоверсию regex

  • (?:\G(?!^)|ab) - группа захвата nbon, соответствующая ab или конец предыдущего совпадения
  • (?:(?!ab).)*? - соответствует любому символу 0 или более раз, как можно меньше, который не запускает последовательность символов ab
  • \K - оператор сброса совпадений
  • cd - подстрока
  • (?=(?:(?!ab).)*?cd) - положительный прогноз, требующий любого символа, 0 или более повторений, как можно меньше, который не запускает последовательность символов ab и затем последовательность символов cd.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...