OVH Cloud OVH Cloud

ebarber à coup de regex

18 réponses
Avatar
Jean-Philippe Caruana
Bonjour,

je désire ébarber des espaces des '"' et des '#' une variable, en début
et en fin, je fais donc :

$valeur =~ s/^((\s*)|(\")|(\#))//g;
$valeur =~ s/((\s*)|(\")|(\#))$//g;

mais seule la fin est ébarbée, pas le début. comment ce fait-ce ?

j'ai essayé avec

my $ebarb = qw/((\s*)|(\")|(\#))/;
$valeur =~ s/^$ebarb//g;
$valeur =~ s/$ebarb$//g;
chomp $valeur;

pour ne pas avoir à ecrire la meme chose 2 fois, mais pas mieux

--
jpc
http://www.enstimac.fr/~caruana/

10 réponses

1 2
Avatar
Paul Gaborit
À (at) Tue, 16 Nov 2004 12:07:19 +0100,
Jean-Philippe Caruana écrivait (wrote):
je désire ébarber des espaces des '"' et des '#' une variable, en début et en
fin, je fais donc :

$valeur =~ s/^((s*)|(")|(#))//g;
$valeur =~ s/((s*)|(")|(#))$//g;

mais seule la fin est ébarbée, pas le début. comment ce fait-ce ?


s* est toujours reconnu (au moins de longueur nulle) donc les autres branches
de l'alternative ne sont jamais essayées.

j'ai essayé avec

my $ebarb = qw/((s*)|(")|(#))/;


my $ebarb = qr/((s*)|(")|(#))/;

qw = quoted word
qr = quoted regexp

$valeur =~ s/^$ebarb//g;
$valeur =~ s/$ebarb$//g;
chomp $valeur;

pour ne pas avoir à ecrire la meme chose 2 fois, mais pas mieux


idem qu'avant...

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Jack
Le 16/11/2004 12:07, :
Bonjour,

je désire ébarber des espaces des '"' et des '#' une variable, en début
et en fin, je fais donc :

$valeur =~ s/^((s*)|(")|(#))//g;
$valeur =~ s/((s*)|(")|(#))$//g;

mais seule la fin est ébarbée, pas le début. comment ce fait-ce ?

j'ai essayé avec

my $ebarb = qw/((s*)|(")|(#))/;
$valeur =~ s/^$ebarb//g;
$valeur =~ s/$ebarb$//g;
chomp $valeur;

pour ne pas avoir à ecrire la meme chose 2 fois, mais pas mieux

Bonjour,


peut être un pb de ce type:
s*
s comprend le blanc et d'autres caractères
peut être des pbs avec les ancres
si le terme gauche de l'alternative est rempli

Avec un petit exemple ce serait bien.

Avatar
Jack
Le 16/11/2004 14:22, :
À (at) Tue, 16 Nov 2004 12:07:19 +0100,
Jean-Philippe Caruana écrivait (wrote):

je désire ébarber des espaces des '"' et des '#' une variable, en début et en
fin, je fais donc :

$valeur =~ s/^((s*)|(")|(#))//g;
$valeur =~ s/((s*)|(")|(#))$//g;

mais seule la fin est ébarbée, pas le début. comment ce fait-ce ?



s* est toujours reconnu (au moins de longueur nulle) donc les autres branches
de l'alternative ne sont jamais essayées.


j'ai essayé avec

my $ebarb = qw/((s*)|(")|(#))/;



my $ebarb = qr/((s*)|(")|(#))/;

qw = quoted word
qr = quoted regexp


$valeur =~ s/^$ebarb//g;
$valeur =~ s/$ebarb$//g;
chomp $valeur;

pour ne pas avoir à ecrire la meme chose 2 fois, mais pas mieux



idem qu'avant...



Donc s serait plus approprié.


Avatar
Paul Gaborit
À (at) Tue, 16 Nov 2004 14:41:51 +0100,
Jack écrivait (wrote):
Donc s serait plus approprié.


Ça dépend des spécifications... On peut imaginer :
s/^(s+|#|")//g;
ou :
s/^[s#"]+//g;

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Jack
Le 16/11/2004 15:16, :
À (at) Tue, 16 Nov 2004 14:41:51 +0100,
Jack écrivait (wrote):

Donc s serait plus approprié.



Ça dépend des spécifications... On peut imaginer :
s/^(s+|#|")//g;
ou :
s/^[s#"]+//g;

Exactement.



Avatar
Jean-Philippe Caruana

À (at) Tue, 16 Nov 2004 12:07:19 +0100,
Jean-Philippe Caruana écrivait (wrote):

je désire ébarber des espaces des '"' et des '#' une variable, en début et en
fin, je fais donc :

$valeur =~ s/^((s*)|(")|(#))//g;
$valeur =~ s/((s*)|(")|(#))$//g;

mais seule la fin est ébarbée, pas le début. comment ce fait-ce ?



s* est toujours reconnu (au moins de longueur nulle) donc les autres branches
de l'alternative ne sont jamais essayées.


bien sur !

s+ est mieux alors...


my $ebarb = qr/((s*)|(")|(#))/;

qw = quoted word
qr = quoted regexp


ok. il me semblait bien.

my $ebarb = qr/((")|(#)|(s+))/;

mais pas mieux : ca marche pour s/$ebarb$// mais pas pour s/^$ebarb// :
mes '"' ne sont effacées qu'en début

ce que je veux : enlever, au choix, en bout de chaine (les 2), tout
espace(s) ou '"' ou '#' (# ou " tjs une seule fois)

--
jpc
http://www.enstimac.fr/~caruana/


Avatar
Paul Gaborit
À (at) Wed, 17 Nov 2004 16:24:09 +0100,
Jean-Philippe Caruana écrivait (wrote):
my $ebarb = qr/((")|(#)|(s+))/;

mais pas mieux : ca marche pour s/$ebarb$// mais pas pour s/^$ebarb// : mes
'"' ne sont effacées qu'en début

ce que je veux : enlever, au choix, en bout de chaine (les 2), tout espace(s)
ou '"' ou '#' (# ou " tjs une seule fois)


Ces spécifications ne sont pas très précises... mais on va faire avec :

$ebarb = qr/(?:s*["#]s*|s+)/;

À ancrer en début (^) ou en fin de chaîne ($) :

s/^$ebarb//;
s/$ebarb$//;

Deux exemples (les ! marquent les débuts et fins de lignes) :

! " essai # ! donnera !essai!
! " "a"## " # " ! donnera !"a"## " #!


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Jean-Philippe Caruana
ce que je veux : enlever, au choix, en bout de chaine (les 2), tout espace(s)
ou '"' ou '#' (# ou " tjs une seule fois)


Ces spécifications ne sont pas très précises...


moi je les trouve précises : je désire enlever aux bouts des chaines soit :
- les espaces (mais pas ceux dans la chaine)
- un seul "
- un seul #

en général, je n'ai pas de combinaison d'espace et de "/# (ce sont des
données bien formatées)

c'est pour ca que j'ai essayé
$ebarb = qr/((")|(#)|(s+))/;


$ebarb = qr/(?:s*["#]s*|s+)/;


de mémoire, je ne sais plus à quoi correspond ?: en début de regex.
c'est pour limiter l'avidité de la regex ?

Deux exemples (les ! marquent les débuts et fins de lignes) :

! " essai # ! donnera !essai!
! " "a"## " # " ! donnera !"a"## " #!


ce n'est pas *exactement* cela, mais ca répond très bien à mon probleme
;-), merci.
(je n'aurais pas de cas comme le cas 1 par exemple)

exemples de mes cas possibles (les ! marquent les débuts et fins de
lignes) :

! pouet 1 #2 "3 ! donnera !pouet 1 #2 "3!
!#pouet 1 #2 "3#! donnera !pouet 1 #2 "3!
!"pouet 1 #2 "3#! donnera !pouet 1 #2 "3!


en tout cas merci Paul.

--
jpc
http://www.enstimac.fr/~caruana/


Avatar
Jack
Le 18/11/2004 10:42, :
ce que je veux : enlever, au choix, en bout de chaine (les 2), tout
espace(s)
- les espaces (mais pas ceux dans la chaine)


^ +| +$




Avatar
Jack
Le 18/11/2004 10:42, :
ce que je veux : enlever, au choix, en bout de chaine (les 2), tout
espace(s)
ou '"' ou '#' (# ou " tjs une seule fois)



Ces spécifications ne sont pas très précises...



- un seul "
à gauche et à droite?

^#(.+)#$
remplacer par la zone mémorisée



1 2