use Regexp::Common qw /balanced/; $r = qr/$RE{balanced}{-begin => "<%"}{-end => "%>"}/; @list = ("aa<% <% %>bb", "aa<% %> <% %>bb", "aa<% <% %> %>bb", "aa<% >% %>bb"); for (@list){ /($r)/; print "$` \t| $1 \t| $'\n"; } #### aa<% | <% %> | bb aa | <% %> | <% %>bb aa | <% <% %> %> | bb aa | <% >% %> | bb