regexpr "variables" ?
Le
kurtz_le_pirate
bonjour,
soit la ligne de donnees :
<Auteur><Larry Wall><Developpeurs><The Perl Foundation>
la regexpr /<(.*?)><(.*?)><(.*?)><(.*?)>/ capture bien les 4 "elements".
la regexpr /<(.*?)><(.*?)><(.*?)>/ capture bien les 3 "elements".
donc s'il y a moins de mofifs de recheche que de donnees, cela fonctionne.
à l'inverse, si on applique 5 motifs /<(.*?)><(.*?)><(.*?)><(.*?)><(.*?)>/
et qui n'y a que 4 elements dans les donnees, je pensais que les $1 à $4
seraient remplis et que $5 serait à vide, ou undef, ou mais non, il n'y
a *aucune* capture.
je rève peut être, mais existe-t-il un moyen pour avoir un nombre "variable"
de motifs ?
--
klp
soit la ligne de donnees :
<Auteur><Larry Wall><Developpeurs><The Perl Foundation>
la regexpr /<(.*?)><(.*?)><(.*?)><(.*?)>/ capture bien les 4 "elements".
la regexpr /<(.*?)><(.*?)><(.*?)>/ capture bien les 3 "elements".
donc s'il y a moins de mofifs de recheche que de donnees, cela fonctionne.
à l'inverse, si on applique 5 motifs /<(.*?)><(.*?)><(.*?)><(.*?)><(.*?)>/
et qui n'y a que 4 elements dans les donnees, je pensais que les $1 à $4
seraient remplis et que $5 serait à vide, ou undef, ou mais non, il n'y
a *aucune* capture.
je rève peut être, mais existe-t-il un moyen pour avoir un nombre "variable"
de motifs ?
--
klp

Poser une question


crame !
la botte supreme de la grande ourse :
my @captures = $la_chaine =~ /<([^>]*)>/g;
Visiblement, tu ne connais pas *?
De ce point de vue, c'est une regression par rapport au post initial.
Visiblement egalement, aucun de vous n'a lu en detail la doc des regexp,
qui pourtant explique bien que n'importe quel caractere bizarre peut
(aujourd'hui ou demain) avoir une semantique particuliere, et donc qu'il
*faut* user abondamment de ...
my @captures = $la_chaine =~ /
Notons que c'est pas forcement genial parce que tout ce qui traine au milieu
va etre ignore, genre: bruit<valeur>bruit<valeur2>bruit
Mais ca par contre, je ne vois pas de facon simple de gerer avec juste de la
regexp...
On peut facilement couper avec split:
my @captures = split /(?<=>)(?=<)/, $chaine;
et ensuite verifier que chaque capture marche.
@captures = map {/^<([^>]*)>$/ or die "Badly formed string: $chaine ($_)"; $1; } @captures;
visiblement, tu t'prends pas pour la moitie d'un naze toi :)
Je fais suivre ta question et ma réponse vers fr.comp.lang.regexp car
elles devraient intéresser tous les utilisateurs des regexp et pas
seulement ceux de Perl.
Le 02/07/2010 09:07, kurtz_le_pirate a écrit :
Dans PCRE il existe une option PCRE_PARTIAL permettant de vérifier une
regexp sur une chaîne incomplète, mais celle-ci n'existe pas dans Perl.
Oui : /
Maintenant, si tu veux que ça soit variable à l'infini (un truc qui
créerait autant de $n que nécessaire), je ne crois pas que ça soit
possible.
Cordialement,
--
Olivier Miakinen
Ça aussi ça me semble être une régression : j'aurais préféré que les
options à venir se contentent de constructions du style (?#...) (où
« # » représente un caractère non encore utilisé), ou bien justement
utilisent le pour les nouvelles constructions.
Mébon, c'est comme ça, il faut faire avec.
Peut-être en deux étapes.
Commencer par récupérer la plus longue chaîne possible sans bruit :
/< ( [^<>] | >< )* >/x
Puis appliquer la regexp simple sur le résultat :
/