use strict;
use warnings;
(?<condition>
[^{}]++
)
}
(?<then>
(?:
(?:(?!{if:[^{}]++}|{else}|{/endif}).)*+
(?R)*+
)*+
)
(?:
{else}
(?<else>
(?:
(?:(?!{if:[^{}]++}|{else}|{/endif}).)*+
(?R)*+
)*+
)
)?+
{/endif}
~six;
my $txt = <<'_STR_';
{if: "'x' == 'y'"}
a
{else}
b
{/endif}
{if: "'x' == 'y'"}
c
{/endif}
{if:minimal}{else}{/endif}
{if: "'nested' == 'things'"}
{if: "'x' == 'y'"}x{if:minimal}{else}{/endif}x{/endif}
{else}
b{if: "'x' == 'y'"}c{/endif}{if: "'x' == 'y'"}c{/endif}
{/endif}
{if:foo} unbalanced {if:bar}ignores first if{/endif}
_STR_
while($txt =~ /$re/g){
print "*** matched if:\n"; print " * cond: $+{condition}\n"; print " * then: $+{then}\n"; }
dXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKbXkgJHJlID0gcXJ+CntpZjpccyorCgkoPzxjb25kaXRpb24+CgkJW157fV0rKwoJKQp9CgooPzx0aGVuPgoJKD86CgkJKD86KD8he2lmOltee31dKyt9fHtlbHNlfXx7L2VuZGlmfSkuKSorCgkJKD9SKSorCgkpKisKKQoKKD86Cgl7ZWxzZX0KCSg/PGVsc2U+CgkJKD86CgkJCSg/Oig/IXtpZjpbXnt9XSsrfXx7ZWxzZX18ey9lbmRpZn0pLikqKwoJCQkoP1IpKisKCQkpKisKCSkKKT8rCgp7L2VuZGlmfQp+c2l4OwoKCm15ICR0eHQgPSA8PCdfU1RSXyc7CntpZjogIid4JyA9PSAneScifQogICAgYQp7ZWxzZX0KICAgIGIKey9lbmRpZn0KCntpZjogIid4JyA9PSAneScifQogICAgYwp7L2VuZGlmfQoKe2lmOm1pbmltYWx9e2Vsc2V9ey9lbmRpZn0KCntpZjogIiduZXN0ZWQnID09ICd0aGluZ3MnIn0KICAgIHtpZjogIid4JyA9PSAneScifXh7aWY6bWluaW1hbH17ZWxzZX17L2VuZGlmfXh7L2VuZGlmfQp7ZWxzZX0KICAgIGJ7aWY6ICIneCcgPT0gJ3knIn1jey9lbmRpZn17aWY6ICIneCcgPT0gJ3knIn1jey9lbmRpZn0Key9lbmRpZn0KCntpZjpmb299IHVuYmFsYW5jZWQge2lmOmJhcn1pZ25vcmVzIGZpcnN0IGlmey9lbmRpZn0KCl9TVFJfCgoKd2hpbGUoJHR4dCA9fiAvJHJlL2cpewoJcHJpbnQgIioqKiBtYXRjaGVkIGlmOlxuIjsKCXByaW50ICIgICogY29uZDogJCt7Y29uZGl0aW9ufVxuIjsKCXByaW50ICIgICogdGhlbjogJCt7dGhlbn1cbiI7CglwcmludCAiICAqIGVsc2U6ICQre2Vsc2V9XG4iIGlmIGRlZmluZWQgJCt7ZWxzZX07Cn0K