# first one my ($start, $middle, undef, $end) = $string =~ /^(.*?)(($pattern)+)(.*?)$/g; # second one, with non-capturing parens -- I like it better my ($start,$middle,$end) = $string =~ /^(.*?)((?:$pattern)+)(.*?)$/g;