Programmation.perl : Expressions regulière
Posté par eMerzh (Jabber id, page perso, ) le 20 février 2006
Bonjour, j'ai un petit problème avec les reg-exp...
Je cherche à remplacer tout les espaces contenu entre 2 quotes.
par exemple j'ai une chaine a='hello "every body".linux "is great"'
après le remplacement avec un %20 par exemple, cette chaine devrai etre :
'hello "every%20body".linux "is%20great"'
Je cherche à remplacer tout les espaces contenu entre 2 quotes.
par exemple j'ai une chaine a='hello "every body".linux "is great"'
après le remplacement avec un %20 par exemple, cette chaine devrai etre :
'hello "every%20body".linux "is%20great"'
> Lire le message (4 commentaires, moyenne: 2).
Vous avez demandé le commentaire #683879.



je dirais...
($b = $a) =~ s/"([^"]*)\s([^"]*)"/$1%20$2/g;
voila
[^]Re: je dirais...
wip , merci beaucoup :)
j'y suis presque ... mais c'est pas encor tout à fais ok....
quand je fait :
$line='Hello "world co" "brol and "';
($b = $line) =~ s/("[^"]*)\s([^"]*")/$1%20$2/g;
print $b."\n";
il me donne :
Hello "world%20co" "brol and%20"
pourquoi il remplace pas l'espace avant "and"...
[^]Re: je dirais...
>pourquoi il remplace pas l'espace avant "and"...
Parce que l'expression ne match qu'un seul espace entre les guillemets.
Je propose
echo 'Hello "world co" "brol and "' | perl -ne 'print join("\"",map { s/ /\%20/g if ($i++ % 2); $_ } split(/"/))'
Ou encore
echo 'Hello "world co" "brol and "' | perl -ne 's/("[^"]*\s[^"]*")/{$t=$1; $t =~ s# #%20#g; $t}/ge; print'
[^]Re: je dirais...
Comme on dit en Perl, "il y a plus d'une façon de le faire", voici la mienne.
Certainement pas la plus efficace, mais elle a le mérite de fonctionner ...
my $chaine = 'hello "world co" "brol and " youpi';
foreach my $avant ( $chaine =~ m/"(.*?\s+.*?)"/g )
{
my $apres = $avant;
$apres =~ s/\s/%20/g;
$chaine =~ s/$avant/$apres/;
}