Соответствие регулярному выражению как можно больше до следующего матча - PullRequest
0 голосов
/ 16 января 2019

У меня есть текст, который содержит коды и тексты для каждого кода, и он следует определенному шаблону. Я пытаюсь получить код и текст каждого кода, группируя каждый из них в шаблон, однако мой шаблон соответствует и возвращает 1 совпадение и получает первый код в одной группе, а остальную часть всего текста в качестве второй группы. , Я пытаюсь добиться того, чтобы моя вторая группа соответствовала как можно большему количеству, пока не увидит, что схема повторяется. Я использую regex101 , чтобы поиграть с шаблоном и посмотреть, с чем я могу работать, несколько вариантов не дали результатов.

В моем шаблоне я указал, что код должен быть ([A-Z0-9]{1,6}), я также попытался указать коды, которые я буду использовать, следующим образом (ADD|DELETE), но, похоже, он все равно совпадает.

Можно ли это на самом деле сделать, или мой шаблон неясен и не подходит для моего случая? Шаблон и текст, над которым я работаю, включены в приведенную выше ссылку.

1 Ответ

0 голосов
/ 18 января 2019

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

(?s)\/([A-Za-z0-9]{1,6})\/((?:(?!\/[A-Za-z0-9]{1,6}\/).)*)

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

Возможна немного более короткая версия, поскольку в PCRE вы можете рекурсивно захватывать групповые шаблоны с помощью подпрограмм регулярного выражения. Часть \/([A-Za-z0-9]{1,6})\/ может быть обернута собственной группой захвата, и затем вместо повторения шаблона вы можете использовать (?1):

(?s)(\/([A-Za-z0-9]{1,6})\/)((?:(?!(?1)).)*)

См. это демо регулярных выражений . Обратите внимание на наличие «технической» группы № 1, она всегда будет присутствовать в результатах матча (-ов).

Однако, если вы предпочитаете эффективность, я бы порекомендовал версию того же регулярного выражения, развернутую в цикле:

\/([A-Za-z0-9]{1,6})\/([^\/]*(?:\/(?![A-Za-z0-9]{1,6}\/)[^\/]*)*)

См. еще одну демонстрацию регулярных выражений

Встроенный модификатор DOTALL (?s), позволяющий . сопоставлять любые символы, включая символы разрыва строки, необходим только для первых двух шаблонов, поскольку третий не содержит, не полагается на точечный шаблон, а скорее на класс отрицанных символов, [^\/]. Он соответствует любому символу, кроме /, включая символы разрыва строки.

Детали шаблона

  • (?s) - встроенный модификатор DOTALL
  • \/([A-Za-z0-9]{1,6})\/ - /, (группа 1) от 1 до 6 буквенно-цифровых символов, /
  • ((?:(?!\/[A-Za-z0-9]{1,6}\/).)*) - (группа 2) любой символ (.), 0 или более повторений (*), который не запускает /[A-Za-z0-9]{1,6}/ соответствующую подстроку
  • (?1) - во второй версии регулярных выражений он такой же, как \/[A-Za-z0-9]{1,6}\/
  • [^\/]*(?:\/(?![A-Za-z0-9]{1,6}\/)[^\/]*)* = (?:(?!\/[A-Za-z0-9]{1,6}\/).)* - любые 0+ символов, кроме / ([^\/]*), а затем 0 или более повторений /, за которыми не следует соответствующая подстрока [A-Za-z0-9]{1,6}\/, а 0+ символов - другие чем /.
...