Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1394 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  supprimer le n eme espace d'une chaine

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

supprimer le n eme espace d'une chaine

n°1341251
dav-42
Posté le 07-04-2006 à 10:56:30  profilanswer
 

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

mood
Publicité
Posté le 07-04-2006 à 10:56:30  profilanswer
 

n°1341257
Elmoricq
Modérateur
Posté le 07-04-2006 à 11:01:52  profilanswer
 

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
n°1341272
dav-42
Posté le 07-04-2006 à 11:17:31  profilanswer
 

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
n°1341274
dav-42
Posté le 07-04-2006 à 11:19:26  profilanswer
 

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

n°1341285
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-04-2006 à 11:30:11  profilanswer
 

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

n°1341291
Elmoricq
Modérateur
Posté le 07-04-2006 à 11:36:04  profilanswer
 

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
n°1341297
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-04-2006 à 11:41:27  profilanswer
 

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

n°1341299
Elmoricq
Modérateur
Posté le 07-04-2006 à 11:42:31  profilanswer
 

Y a pas d'souçaille :)


Message édité par Elmoricq le 07-04-2006 à 11:43:06
n°1341308
dav-42
Posté le 07-04-2006 à 11:47:15  profilanswer
 

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
n°1341316
Elmoricq
Modérateur
Posté le 07-04-2006 à 11:50:42  profilanswer
 

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
mood
Publicité
Posté le 07-04-2006 à 11:50:42  profilanswer
 

n°1341317
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-04-2006 à 11:50:55  profilanswer
 

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
n°1341328
dav-42
Posté le 07-04-2006 à 11:57:16  profilanswer
 

Effectivement  :pfff:  
 
Merci et honte à moi

n°1341336
dav-42
Posté le 07-04-2006 à 12:00:33  profilanswer
 

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
n°1341341
Elmoricq
Modérateur
Posté le 07-04-2006 à 12:03:12  profilanswer
 

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
n°1341352
dav-42
Posté le 07-04-2006 à 12:13:57  profilanswer
 

Merci beaucoup

n°1347306
lami20j
Posté le 15-04-2006 à 00:51:03  profilanswer
 

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

n°1347375
Elmoricq
Modérateur
Posté le 15-04-2006 à 09:50:27  profilanswer
 

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

n°1347377
lami20j
Posté le 15-04-2006 à 10:00:51  profilanswer
 

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

n°1347380
Elmoricq
Modérateur
Posté le 15-04-2006 à 10:06:15  profilanswer
 

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
n°1347385
lami20j
Posté le 15-04-2006 à 10:16:35  profilanswer
 

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

n°1348379
Elmoricq
Modérateur
Posté le 17-04-2006 à 22:18:13  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  supprimer le n eme espace d'une chaine

 

Sujets relatifs
supprimer des entrées d'un fichier texteBatch windows - Supprimer/modifier une ligne d'un fichier
[Résolu] Exploser une chainePHP 4.3.10 chez Free : impossible de supprimer un répertoire vide !?
Redimensionnement à la chaine d'image[DIVERS]Demande conseil pour création d'un espace membre et photo
A supprimer.[Algo] Recherche de sous chaîne
[ RESOLU ] chercher dans une chaine de caractèreConstruire une chaîne "en dur"
Plus de sujets relatifs à : supprimer le n eme espace d'une chaine


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR