Let's say I want to split the metadata from the Twig template
---
some metadata
multiple lines
---
Twig template
More data
I came up with /\A---\R(.+?\R)?---\R(.*)\Z/s
which does it more or less but I am wondering whether it can become pathological in backtracking.
Your regex seems working well.
You may make it somewhat more efficient if you "unroll" the first lazy dot pattern like
/\A---\R(.*(?:\R(?!---\R).*)*\R)?---\R(?s)(.*)\Z/
See the regex demo. Note: no mofifiers are necessary, there is one inline (?s)
modifier inside the pattern.
Details
\A
- start of string ---\R
- a full ---
line with a linebreak (.*(?:\R(?!---\R).*)*\R)?
- an optional Capturing group 1:
.*
- the whole line(?:\R(?!---\R).*)*
- 0 or more repetitions of
\R(?!---\R)
- a line break that is not followed with a ---
line followed with a linebreak.*
- the whole line\R
- a linebreak sequence---\R
- a full ---
line with a linebreak (?s)
- an inline DOTALL modifier making the dots to the right match line break chars(.*)
Group 2: any 0+ chars as many as possible\Z
- end of string.