my $str = q{[S [NP This NP] [VP is [NP [PP to [NP the left NP] PP] NP] VP] . S]}; my $bracket; $bracket = qr{ (?: (?> [^][]* ) | \[ (??{ $bracket }) \] )+ }x; for (get_brackets($str, 1)) { print "<$_>\n" } for (get_brackets($str, 2)) { print "<<$_>>\n" } sub get_brackets { my ($str, $depth) = @_; my @hits = $str; @hits = map m{\[($bracket)\]}g, @hits for 1 .. $depth; return map "[$_]", @hits; # put the []'s back in }