>perl -wMstrict -le "my $open = '{{'; my $close = ']]'; ;; my $opener = qr{ \Q$open\E }xms; my $closer = qr{ \Q$close\E }xms; my $body = qr{ [^\Q$open$close\E] }xms; ;; my $regex = qr{ ( $opener (?: $body++ | (?1) )* $closer ) }xms; ;; my $s = 'xxx {{ foo {{ bar ]] baz ]] yyy {{ fee ]] zzz'; ;; print qq{'$1'} while $s =~ m{ $regex }xmsg; " '{{ foo {{ bar ]] baz ]]' '{{ fee ]]' #### >perl -wMstrict -le "print qq{perl version $]}; ;; my $opener = qr{ \{\{ }xms; my $closer = qr{ \]\] }xms; my $body = qr{ (?! $opener) (?! $closer) . }xms; ;; use re 'eval'; our $regex = qr{ $opener (?: (?> $body+) | (??{ $regex }) )* $closer }xms; ;; my $s = 'xxx {{ foo {{ bar ]] baz [OK] ]] [NO] yyy {{ fee ]] zzz'; ;; print qq{'$1'} while $s =~ m{ ($regex) }xmsg; " perl version 5.008009 '{{ foo {{ bar ]] baz [OK] ]]' '{{ fee ]]'