use strict; my $a = '(0,((1,2),3,(4,5),6),7,8)'; my $tail = qr{5\)}; my $matching_parens = qr{ ( # paren group 1 (parens) \( (?: (?> [^()]+ ) # Non-parens without backtracking | (?1) # Recurse to start of paren group 1 )* \) ) .* (?<= $tail ) }x; $a =~ /$matching_parens/; print "$1\n";