Ваше регулярное выражение, кажется, работает хорошо.
Вы можете сделать его несколько более эффективным, если вы "развернете" первый ленивый шаблон точек, например,
/\A---\R(.*(?:\R(?!---\R).*)*\R)?---\R(?s)(.*)\Z/
См. Демонстрационную версию регулярных выражений . Примечание: никаких модификаторов не требуется, в шаблоне есть один встроенный модификатор (?s)
.
Подробности
\A
- начало строки ---\R
- полная строка ---
с переводом строки (.*(?:\R(?!---\R).*)*\R)?
- дополнительная группа захвата 1: .*
- вся строка (?:\R(?!---\R).*)*
- 0 или более повторений \R(?!---\R)
- разрыв строки, за которым не следует строка ---
, за которой следует разрыв строки .*
- весьстрока
\R
- последовательность перевода строки
---\R
- полная строка ---
с переводом строки (?s)
- встроенный модификатор DOTALL, делающий точки справа от совпадающих символов разрыва строки (.*)
Группа 2: любые 0+ символов максимально возможного числа \Z
- конецстроки.