my @groups = qw'[a-zA-Z]+ \d+ \s+'; my $matcher_pattern = join('|', (map {"($_)"} @groups, '.')); my $pattern = ''; MATCH: while ($string =~ /$matcher_pattern/g) { no strict 'refs'; for my $index (1.. scalar @groups) { if ($$index) { $pattern .= $groups[$index - 1]; next MATCH; } } $pattern .= quotemeta ${scalar @groups + 1}; } $regex = qr/$pattern/