my $data = join('',); my $quoted_string = qr/ " (?: (?: [^"]* ) | (?: (?<= \\ ) " ) )* " /x; my $balenced_brackets = qr/ \{ (?: (?> [^{}"] *) | (??{$quoted_string}) | (??{$balenced_brackets}) )* \} /x; my $function_header = qr/ function \s+ \w+ \s* \( [^)]* \) \s* /x; my @matches = $data =~ /($function_header $balenced_brackets)/gx; print join("\n\n",@matches);