Регулярное выражение сопоставляет все между несколькими совпадениями в нескольких строках

#regex

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

Вопрос:

Вот как выглядит моя строка / файл:

 == Section 1 ==
Content of section 1. Bla bla bla
this = tha
numbers bla bla

== Section 2 ==
Content of section 3. Bla bla bla
this = tha
numbers bla bla

== Section 3 ==
Content of section 3. Bla bla bla
this = tha
numbers bla bla
 

Теперь я хочу сопоставить заголовок раздела (между ‘==’) и содержимое самого раздела.

Это соответствует самим разделам: /== (.*) ==/g затем я попытался сопоставить промежуточные части, но здесь я застрял. Я изменил на allo новую строку для точек и сделал первое совпадение несогласованным: /== (.*?) ==(.*?)/gs но второе совпадение теперь либо не соответствует ничему (.*?) , либо всему (.*) , но я хочу совпадать «до следующего совпадения» или до конца строки.

Как я могу это сделать?

Ответ №1:

Поскольку у вас есть 2 разрыва строки между каждым блоком, вы можете использовать это регулярное выражение:

 /^==.*==r?n(?:. r?n)*. /gm
 

Демонстрация регулярных выражений

Подробности регулярного выражения:

  • ^ : Начать
  • == : Совпадение ==
  • .* : Сопоставление 0 или более любых символов
  • == : Совпадение ==
  • r?n : Разрыв строки
  • (?:. r?n)* : Сопоставление 0 или более строк, содержащих 1 любых символов
  • . : Сопоставление 1 любых символов

Ответ №2:

Вы могли бы использовать

 ^== (. ?) ==((?:r?n(?!== ).*)*)
 

Шаблон совпадает:

  • ^ Начало строки
  • == Совпадение буквально
  • (. ?) Группа захвата 1, сопоставьте любой символ как можно меньше для заголовка
  • == Совпадение буквально
  • ( Группа захвата 2 для содержимого
    • (?:r?n(?!== ).*)* Сопоставьте всю строку, если она не начинается с ==
  • ) Закрыть группу 2

Демонстрация регулярных выражений

Или наоборот, без начальной новой строки

 ^== (. ?) ==r?n((?:(?!== ).*(?:r?n|$))*)
 

Демонстрация регулярных выражений

Комментарии:

1. спасибо, первое достаточно хорошо для моей цели. однако у меня есть следующий вопрос: почему это не работает: /^== (. ?) ==r?n((?:r?n(?!== ).*)*)/gm опустить разрыв строки после == ?

2. @JanOechsler В этом случае вы сопоставляете 2 новых строки, здесь r?n и здесь (?:r?n , которых нет в данных примера.