our $parens; my $re = qr{ ( \( (?{$parens++ if $parens >= 0}) | \) (?{$parens-- if $parens >= 0}) | . )* }x; my $this = 'a(bc(de)fg)h'; my $that = '(a(bc(de)fg)h'; my $other = 'a(bc(de)fg)h)'; my $bla = ')a(bc(de)fg)h)'; $parens = 0; print "this, $parens\n" if $this =~ /$re/; $parens = 0; print "that, $parens\n" if $that =~ /$re/; $parens = 0; print "other, $parens\n" if $other =~ /$re/; $parens = 0; print "bla, $parens\n" if $bla =~ /$re/; #### this, 0 that, 1 other, -1 bla, -1