m[
<% # Opening delimiter.
(?: # Match stuff that isn't a closing delim:
[^%]+ # Things that can't start one.
| %+[^>] # Might start one but isn't one.
)* # As many non-closing-delims as you like.
%> # Closing delimiter.
]x
####
"<% %%> %>"
"<%" matches <%
" " matches [^%]+ so (?: ... )* has matched once
"%%" matches %+
">" fails on [^>] so we back-track
"%" now matches %+
"%" matches [^>] so (?: ... )* has matched twice
"> " matches [^%]+ so (?: ... )* has matched 3 times
"%>" matches %> so regex finishes
####
"<% %%>"
####
m[
<% # Opening delimiter.
(?: # Match stuff that isn't a closing delim:
[^%]+ # Things that can't start one.
| %+[^%>] # Might start one but isn't one.
)* # As many non-closing-delims as you like.
%* # PUNT!
%> # Closing delimiter.
]x