use 5.010; use warnings; use Regexp::Grammars; my $balanced_brackets = qr{ <debug:step> <left_delim=( \( )> (?: <[escape=( \\ )]> | <recurse=( (?R) )> | <[simple=( . )]> )* <right_delim=( \) )> }xms; while (<>) { if (/$balanced_brackets/) { say 'matched:'; use Data::Dumper 'Dumper'; warn Dumper \%/; } }