GNT sans publicité, site mobile, fonctionnalitées exclusives...

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
Lire les 14 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
luc2
Le #22321321
Le 02-07-2010, kurtz_le_pirate
je pensais que les $1 à $4 seraient remplis et que $5 serait à vide,
ou undef, ou ... mais non, il n'y a *aucune* capture.



crame !

je rève peut être, mais existe-t-il un moyen pour avoir un nombre
"variable" de motifs ?



la botte supreme de la grande ourse :

my @captures = $la_chaine =~ /<([^>]*)>/g;
espie
Le #22321841
In article luc2
Le 02-07-2010, kurtz_le_pirate
je pensais que les $1 à $4 seraient remplis et que $5 serait à vide,
ou undef, ou ... mais non, il n'y a *aucune* capture.



crame !

je rève peut être, mais existe-t-il un moyen pour avoir un nombre
"variable" de motifs ?



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;
luc2
Le #22322121
Le 02-07-2010, Marc Espie
Visiblement, tu ne connais pas *?
...

Visiblement egalement, aucun de vous n'a lu en detail la doc des regexp,
...



visiblement, tu t'prends pas pour la moitie d'un naze toi :)
Olivier Miakinen
Le #22322151
Bonjour,

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 :

soit la ligne de donnees :
<Auteur><Larry Wall><Developpeurs><The Perl Foundation>

la regexpr / la regexpr / 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.



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.

je rève peut être, mais existe-t-il un moyen pour avoir un nombre "variable"
de motifs ?



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
Olivier Miakinen
Le #22322301
Le 02/07/2010 12:11, Marc Espie a écrit :

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 =~ /


Ç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.

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...



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 :
/
Publicité
Suivre les réponses
Poster une réponse
Anonyme