OVH Cloud OVH Cloud

regexp multiples

4 réponses
Avatar
Paul Bert
bonjour,

J'ai plusieurs regexp contenues dans des variables $re1, $re2, ...

Quand je parse un fichier, je voudrais savoir si une ligne match une de
ces regexp, et si oui, laquelle.

Pour le moment, je fais ça avec un gros :

if (/$re1/)
...
elsif (/$re2/)
...
...

Mais y-a-t-il un moyen de faire qqc du genre :

if (/$re1|$re2|.../

et de savoir quelle regexp a matché ?

Paul.

4 réponses

Avatar
jl_morel
Dans l'article ,
com a dit...

J'ai plusieurs regexp contenues dans des variables $re1, $re2, ...

Quand je parse un fichier, je voudrais savoir si une ligne match une de
ces regexp, et si oui, laquelle.

Pour le moment, je fais ça avec un gros :

if (/$re1/)
...
elsif (/$re2/)
...
...

Mais y-a-t-il un moyen de faire qqc du genre :

if (/$re1|$re2|.../

et de savoir quelle regexp a matché ?



Si vous mettez des parenthèses autour de chaque alternative, le numéro de la
regexp qui correspond est dans $#- et le contenu dans $+. Exemple :

#!/usr/bin/perl -w
use strict;

my $s = 'xxxbbyyyzzz';

if ($s =~ /(aa)|(bb)|(cc)/) {
print "$#- = $#- et $+ = $+n";
}

__END__

donne $#- = 2 et $+ = bb

Dans ce cas $1 et $3 sont undef et $2 contient 'bb'...d'où l'utilité de $+.
Faites bien attention aux numéros si des parenthèses sont imbriquées.

Voir perlvar :

http://www.bribes.org/perl/docfr/perlvar.html#LC83656F4

HTH

--
J-L.M.

Avatar
Paul Bert
In article <c1n4ql$em$, Jean-Louis MOREL wrote:
Dans l'article ,
com a dit...

J'ai plusieurs regexp contenues dans des variables $re1, $re2, ...

Quand je parse un fichier, je voudrais savoir si une ligne match une de
ces regexp, et si oui, laquelle.

Pour le moment, je fais ça avec un gros :

if (/$re1/)
...
elsif (/$re2/)
...
...

Mais y-a-t-il un moyen de faire qqc du genre :

if (/$re1|$re2|.../

et de savoir quelle regexp a matché ?



Si vous mettez des parenthèses autour de chaque alternative, le numéro de la
regexp qui correspond est dans $#- et le contenu dans $+. Exemple :

#!/usr/bin/perl -w
use strict;

my $s = 'xxxbbyyyzzz';

if ($s =~ /(aa)|(bb)|(cc)/) {
print "$#- = $#- et $+ = $+n";
}

__END__

donne $#- = 2 et $+ = bb

Dans ce cas $1 et $3 sont undef et $2 contient 'bb'...d'où l'utilité de $+.
Faites bien attention aux numéros si des parenthèses sont imbriquées.

Voir perlvar :

http://www.bribes.org/perl/docfr/perlvar.html#LC83656F4


Merci, c'est exactement ce dont j'avais besoin.

Et pour ma curiosité maintenant, comment gérer le cas où plusieurs
expressions correspondent (par exemple avec my $s = 'xxxbbyyyaazzzz').

Paul


Avatar
jl_morel
Dans l'article ,
com a dit...
[couic]

Merci, c'est exactement ce dont j'avais besoin.

Et pour ma curiosité maintenant, comment gérer le cas où plusieurs
expressions correspondent (par exemple avec my $s = 'xxxbbyyyaazzzz').



Fastoche ;-)

#!/usr/bin/perl -w
use strict;

my $s = 'xxxbbyyyaazzzz';

while ($s =~ /(aa)|(bb)|(cc)/g) {
print "$#- = $#- et $+ = $+n";
}

__END__

--
J-L.M.

Avatar
Paul Bert
In article <c1nk68$qj9$, Jean-Louis MOREL wrote:
Dans l'article ,
com a dit...
[couic]

Merci, c'est exactement ce dont j'avais besoin.

Et pour ma curiosité maintenant, comment gérer le cas où plusieurs
expressions correspondent (par exemple avec my $s = 'xxxbbyyyaazzzz').



Fastoche ;-)

#!/usr/bin/perl -w
use strict;

my $s = 'xxxbbyyyaazzzz';

while ($s =~ /(aa)|(bb)|(cc)/g) {
print "$#- = $#- et $+ = $+n";
}

__END__


Pourquoi est-ce que ça semble tellement évident quand on a la solution !

Merci bcp.

Paul