supprimer le n eme espace d'une chaine

supprimer le n eme espace d'une chaine - Perl - Programmation

Marsh Posté le 07-04-2006 à 10:56:30    

Bonjour,
 
 
Existe il une fonction en perl qui me permetrait de supprimer par exemple le 6 eme espace d'une chaine de caractère?
 
 
Merci

Reply

Marsh Posté le 07-04-2006 à 10:56:30   

Reply

Marsh Posté le 07-04-2006 à 11:01:52    

Oui.
 
EDIT : histoire d'éviter de faire mon lourd, il te suffit d'utiliser une expression régulière.
 
Exemple :

my $chaine = "abc def efg hij klm nop qrs tuv xyz";
 
$chaine =~ s/((\S*?\s){5})(\S*?)\s(.*)/$1$3$4/;


 
Explication : le premier groupement, $1, ((\S*?\s){5}) rassemble cinq pâtés de caractères qui ne sont pas des espaces, suivis d'un espace.
$2 on l'oublie, il contient le dernier de ces pâtés trouvé.
$3 contient le pâté précédent le sixième espace à supprimer.
\s c'est l'espace qu'on veut supprimer
$4 c'est tout le reste qui suit, sans distinction.


Message édité par Elmoricq le 07-04-2006 à 11:20:12
Reply

Marsh Posté le 07-04-2006 à 11:17:31    

Ok merci peux tu me dire laquelle?
 
Re ok et re merci  :jap:


Message édité par dav-42 le 07-04-2006 à 11:18:10
Reply

Marsh Posté le 07-04-2006 à 11:19:26    

Les expressions régulières sont reinnes en perl apparemment :)

Reply

Marsh Posté le 07-04-2006 à 11:30:11    

Pour faire mon lourd à mon tour, je tiens a signaler que  

Code :
  1. my $chaine = "abc def efg hij klm nop qrs tuv xyz";
  2. $chaine =~ s/((\S*?\s){5})(\S*?)\s(.*)/$1$3$4/;


Ne marche pas si la chaine commence par un espace :o

Reply

Marsh Posté le 07-04-2006 à 11:36:04    

Bien sûr que si, \S* signifiant "0 ou n caractères qui ne sont pas des espaces" [:itm]

Message cité 1 fois
Message édité par Elmoricq le 07-04-2006 à 11:36:34
Reply

Marsh Posté le 07-04-2006 à 11:41:27    

Elmoricq a écrit :

Bien sûr que si, \S* signifiant "0 ou n caractères qui ne sont pas des espaces" [:itm]


 :jap: totally true... j'aurais mieux fait de fermer ma bouche :o

Reply

Marsh Posté le 07-04-2006 à 11:42:31    

Y a pas d'souçaille :)


Message édité par Elmoricq le 07-04-2006 à 11:43:06
Reply

Marsh Posté le 07-04-2006 à 11:47:15    

Aprés avoir testé ceci:
 

Code :
  1. my $chaine = "abc def efg hij klm nop qrs tuv xyz";
  2. print "$chaine\n";
  3. $chaine =~ s/((S*?s){5})(S*?)s(.*)/$1$3$4/;
  4. print $chaine;


 
J'obtiens ceci:
 

Citation :


abc def efg hij klm nop qrs tuv xyz
abc def efg hij klm nop qrs tuv xyz


Message édité par dav-42 le 07-04-2006 à 11:47:39
Reply

Marsh Posté le 07-04-2006 à 11:50:42    

Gaffe au souci de backslash sur le forum (prendre le snipet que j'ai placé dans ma première réponse) :
 

$ cat test.pl
#! /usr/bin/perl  
 
use strict;
 
my $chaine = "abc def efg hij klm nop qrs tuv xyz";
 
$chaine =~ s/((\S*?\s){5})(\S*?)\s(.*)/$1$3$4/;
 
print "$chaine\n";
$ test.pl
abc def efg hij klm nopqrs tuv xyz


Message édité par Elmoricq le 07-04-2006 à 11:51:23
Reply

Marsh Posté le 07-04-2006 à 11:50:42   

Reply

Marsh Posté le 07-04-2006 à 11:50:55    

manque les \ devant les S et s, vérifie bien ce qu'avait ecrit Elmoricq
 
edit: [:benou_grilled]


Message édité par anapajari le 07-04-2006 à 11:52:16
Reply

Marsh Posté le 07-04-2006 à 11:57:16    

Effectivement  :pfff:  
 
Merci et honte à moi

Reply

Marsh Posté le 07-04-2006 à 12:00:33    

Au fait n'étant pas un expert des expressions régulières là j'avoue ne pas arriver à tout traduire surtout /$1$3$4/ . A votre bon coeur si je peux abuser.
 
Merci


Message édité par dav-42 le 07-04-2006 à 12:01:53
Reply

Marsh Posté le 07-04-2006 à 12:03:12    

C'est dans la première réponse que je t'ai faite.
Ajout à l'explication :
Dans l'exemple ci-dessus,
$1 == "abc def efg hij klm "
$2 == "klm " (donc on l'oublie, il ne nous intéresse pas)
$3 == "nop"
$4 == "qrs tuv xyz"
 
Pour plus de détails en revanche, il vaut mieux consulter http://www.perldoc.com


Message édité par Elmoricq le 07-04-2006 à 12:14:58
Reply

Marsh Posté le 07-04-2006 à 12:13:57    

Merci beaucoup

Reply

Marsh Posté le 15-04-2006 à 00:51:03    

Salut,
 

anapajari a écrit :

Pour faire mon lourd à mon tour, je tiens a signaler que  
Ne marche pas si la chaine commence par un espace :o


 
Donc Elmoricq a expliqué que ça marche. Cependant il y a des cas où ça ne marche pas.
 
Par exemple l'existance de 2 ou plus des espaces ou des tabulations entre les mots.
Ex: entre nop et qrs il y a 2 espaces
"abc def efg hij klm nop  qrs tuv xyz"
 
Mesure preventive

Code :
  1. $chaine =~s/\s{2,}/ /;


script complet

Code :
  1. #! /usr/bin/perl
  2. #
  3. use warnings;
  4. use strict;
  5. my $chaine = "abc def efg hij klm nop             qrs tuv xyz";
  6. $chaine =~s/\s{2,}/ /;
  7. $chaine =~ s/((\S*?\s){5})(\S*?)\s(.*)/$1$3$4/;
  8. print "$chaine\n";


lami20j

Reply

Marsh Posté le 15-04-2006 à 09:50:27    

Ou alors on peut utiliser \s+, ce qui permettra de gérer cette possibilité sans altérer la chaîne.

Reply

Marsh Posté le 15-04-2006 à 10:00:51    

Salut,
 

Elmoricq a écrit :

ce qui permettra de gérer cette possibilité sans altérer la chaîne.


 
Dans cet esprit alors il peut utiliser ça depuis le début.

Code :
  1. (my $tmp = $chaine) =~ s/((\S*?\s+){5})(\S*?)\s+(.*)/$1$3$4/;


lami20j

Reply

Marsh Posté le 15-04-2006 à 10:06:15    

C'est à ça que je pensais. :)
 
Je n'avais pas prévu ce cas-là lorsque j'ai rédigé à ma regexp.


Message édité par Elmoricq le 15-04-2006 à 10:06:26
Reply

Marsh Posté le 15-04-2006 à 10:16:35    

Re,
 
Il manque toujours les \ avant S et s
Pourquoi? Pourtant je les ai mis au début. C'est à cause des  balises code? Merci.
 
lami20j

Reply

Marsh Posté le 17-04-2006 à 22:18:13    

Oui, c'est à cause de ces balises. Le temps que ce soit résolu, j'utilise [fixed][/fixed].

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed