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/

8 réponses

1 2
Avatar
Paul Gaborit
À (at) Thu, 18 Nov 2004 10:42:59 +0100,
Jean-Philippe Caruana écrivait (wrote):
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 :


Ce n'est pas à toi d'en juger... On se doute que tu es d'accord avec toi-même
;-)

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)


En fait les seules spécifications précises seraient la regexp elle-même ;-)

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 ?


(?:...) permet de créer un groupe comme (...) mais sans le mémoriser (on ne
peut pas le réutiliser via 1 ou $1).

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!


Bon alors :

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

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



Avatar
Jack
Le 18/11/2004 11:43, :
À (at) Thu, 18 Nov 2004 10:42:59 +0100,
Jean-Philippe Caruana écrivait (wrote):

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 :



Ce n'est pas à toi d'en juger... On se doute que tu es d'accord avec toi-même
;-)


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)



En fait les seules spécifications précises seraient la regexp elle-même ;-)


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 ?



(?:...) permet de créer un groupe comme (...) mais sans le mémoriser (on ne
peut pas le réutiliser via 1 ou $1).


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!



Bon alors :

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

Avec un espace dans la chaine?





Avatar
Paul Gaborit
À (at) Fri, 19 Nov 2004 10:52:26 +0100,
Jack écrivait (wrote):
Avec un espace dans la chaine?


Pourquoi pas...

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

Avatar
Jack
Le 19/11/2004 13:41, :
À (at) Fri, 19 Nov 2004 10:52:26 +0100,
Jack écrivait (wrote):

Avec un espace dans la chaine?



Pourquoi pas...

Heu... il ne se fait pas squizzer?



Avatar
Paul Gaborit
À (at) Fri, 19 Nov 2004 14:33:50 +0100,
Jack écrivait (wrote):
Le 19/11/2004 13:41, :
À (at) Fri, 19 Nov 2004 10:52:26 +0100,
Jack écrivait (wrote):

Avec un espace dans la chaine?
Pourquoi pas...


Heu... il ne se fait pas squizzer?



Non parce qu'on ancre l'expression au début (^) ou à la fin ($) de la chaîne.

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



Avatar
Jack
Le 19/11/2004 15:02, :
À (at) Fri, 19 Nov 2004 14:33:50 +0100,
Jack écrivait (wrote):

Le 19/11/2004 13:41, :

À (at) Fri, 19 Nov 2004 10:52:26 +0100,
Jack écrivait (wrote):


Avec un espace dans la chaine?


Pourquoi pas...



Heu... il ne se fait pas squizzer?



Non parce qu'on ancre l'expression au début (^) ou à la fin ($) de la chaîne.

J'ai coincé :-) c'est les "# que disparaissent dans le texte.





Avatar
Paul Gaborit
J'écrivais :
Non parce qu'on ancre l'expression au début (^) ou à la fin ($) de la
chaîne.



À (at) Fri, 19 Nov 2004 15:46:58 +0100,
Jack écrivait (wrote):
J'ai coincé :-) c'est les "# que disparaissent dans le texte.


Pas plus... et pour la même raison.


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


Avatar
Jack
Le 19/11/2004 17:10, :
J'écrivais :

Non parce qu'on ancre l'expression au début (^) ou à la fin ($) de la
chaîne.




À (at) Fri, 19 Nov 2004 15:46:58 +0100,
Jack écrivait (wrote):

J'ai coincé :-) c'est les "# que disparaissent dans le texte.



Pas plus... et pour la même raison.


Les ancres étaient ok mais j'ai laisser trainer un g.




1 2