use strict; use warnings FATAL => 'all'; my $string = "aacbbbcac"; my $re1 = qr/((a+)?(b+)?(c))/; while ($string =~ /$re1/g) { foreach (0..$#-) { printf "Group %d: <%s>\n", $_, defined($-[$_]) ? substr($string, $-[$_], $+[$_] - $-[$_]) : ''; } print "\n"; } #### Group 0: Group 1: Group 2: Group 3: <> Group 4: Group 0: Group 1: Group 2: <> Group 3: Group 4: Group 0: Group 1: Group 2: Group 3: <> Group 4: