Регулярное выражение соответствует первой группе с определенным текстом - PullRequest
2 голосов
/ 22 мая 2019

Я пытаюсь сопоставить блоки текста, которые содержат определенный текст внутри них. Каждый блок четко определяется стандартными текстовыми шаблонами начала / конца.

В приведенном ниже примере я хочу сопоставить шаги 1 и 3 от «начала шага» до «конца шага», так как они содержат текст «database: dev». Однако мое текущее регулярное выражение соответствует шагу 1 в порядке, но затем совпадает с шагами 2 и 3 в одном совпадении. Это, вероятно, легче увидеть на примере: https://regex101.com/r/56tfOQ/3/

Мне нужно указать, что каждое совпадение может содержать только один «шаг с начала», но я не могу понять, как это сделать.

Регулярное выражение, которое я сейчас использую:

(?msi)step start.*?database:dev.*?step end

Пример текста:

step start
    name:step1
    database:dev1
step end
step start
    name:step2
    database:test1
step end
step start
    name:step3
    database:dev2
step end
step start
    name:step4
    database:test2
step end

1 Ответ

2 голосов
/ 22 мая 2019

В обычном сценарии вы можете использовать закаленный жадный токен , такой как (?:(?!<STOP_PATTERN>).)*?, между начальным разделителем и некоторой третьей строкой, которая должна появляться между разделителями.

Вы можете написатьВаше регулярное выражение как

(?si)step start(?:(?!step start).)*?database:dev.*?step end

Однако, похоже, ваш начальный разделитель находится в начале строки.Тогда имеет смысл использовать

(?msi)^step start(?:(?!^step start).)*?database:dev.*?step end

См. regex demo

График регулярных выражений:

enter image description here

Подробности

  • (?msi) - включены режимы многострочного, точечного и нечувствительного к регистру
  • ^ - начало строки (с m опция включена)
  • step start - начальный разделитель
  • (?:(?!^step start).)*? - жадный жетон , соответствующий любому символу, 0+ случаев / повторений, всего нескольконасколько возможно, это не запускает последовательность символов step start в начале строки
  • database:dev - буквенную подстроку
  • .*? - любые 0+ символов, всего нескольковозможно
  • step end - конечный разделитель.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...