#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
, которых нет в данных примера.