Si vous créez l'expression régulière en utilisant un programme de toute façon, il est facile d'injecter les séquences appropriées (?<...>)
puis de vérifier ensuite lesquelles ont été trouvées. En adaptant le programme que vous avez posté comme premier essai :
#!/usr/bin/perl
use strict;
use warnings;
my $string = "Dear Brother, fgfgfg Test Test2 Soon trthggh";
my @regexarray = (qr/expr1/, qr/expr2/, qr/dear.{0,6}(brother|friend)/i, qr/Soon/, qr/out.php\?s=(7644|4206|6571|4205)/);
my $i= 0;
my $regexstring = join "|", map {
my $groupname= sprintf 'group_%d', $i++;
qr/(?<$groupname>$_)/i
} @regexarray;
if ($string =~ /($regexstring)/i){
my $match = $1;
print "Found <$1>\n";
print "Matched via ";
(my $found) = keys %+;
print "$found => $+{$found}\n" for keys %+;
$found =~ /(\d+)$/
or die "Invalid group name '$found'";
my $index = $1;
print "Matched via /$regexarray[ $index ]/\n";
}
J'ai changé les chaînes en expressions régulières ci-dessus pour faciliter les citations et l'insensibilité à la casse.
Sortie
Found
Matched via group_2 => Dear Brother
Matched via /(?^i:dear.{0,6}(brother|friend))/