[regexp] lookbehind

Fermé
Utilisateur anonyme - 23 oct. 2005 à 05:55
 Utilisateur anonyme - 23 oct. 2005 à 18:27
bonjour,

j'ai un petit problème agaçant.

c'est simple, je veux dans un texte constitué de lignes de plusieurs mots ou d'un seul, ne faire une substitution dans un mot que si ce mot, de longueur inconnue, ne commence pas par une séquence précise.

théoriquement, en perl en tout cas, il me semble que ça relève d'un lookbehind

par exemple, mettons que je veuille changer tous les i en W dans tous les mots ne commençant pas par paf

soit, aller de:

sirop nimo pafcouic tralalilère pinpafpon pifpaf laloulère cuicui pafcitron

à

sWrop nWmo pafcouic tralalWlère pWnpafpon pWfpaf laloulère cuWcuW pafcitron

or, le lookbehind ne permet pas de longueur de chaîne variable:

on peut faire
perl -pe 's/(?<!\bpaf\S{3})i/W/g' 

par exemple, mais pas
perl -pe 's/(?<!\bpaf\S*)i/W/g'


j'ai du mal à croire que ce soit impossible de ne faire de substitution sur des mots que s'ils ne commencent pas par une chaîne donnée

si quelqu'un a une solution à me proposer, je préfère du perl à cause d'une substitution particulière (s/=([0-9a-fA-F]{2})/chr hex $1/g) et avec sed mettons, y a un foirage (\x\1 n'est pas interprété lors de la substitution)

merci

2 réponses

crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 507
23 oct. 2005 à 13:19
Salut,
Vu qu'y a pas de réponse...
J'avais fait un exo qui ressemble à ton problème lors d'une initiation à PERL.
Le formateur nous avais dit que c'était pas possible via une regex, il fallait
passer par programme. Je te files le code, si ça peut t'aider :
#!/usr/bin/perl
# faire des remplacements dans des mots lut sur l'entrée standard
# le résultat sera sur la sortie standard
# les mots ayant un préfixe ne devront pas être touché par le remplacement
# ./remplace.pl prefixe cherche remplace
$prefix = $ARGV[0] ;
$cherche = $ARGV[1] ;
$remplace = $ARGV[2] ;
while ( $ligne = <STDIN> )
        {
        $_ = $ligne ; $fin = $ligne ;
        while ( /\b${prefix}\S*/ )
                {
                $debut = $` ;
                $fin = $' ;
                $mot = $& ;
                $debut =~ s/${cherche}/${remplace}/g;
                print $debut, $mot ;
                $_ = $fin ;
                }
        $fin =~ s/${cherche}/${remplace}/g;
        print $fin ;
        }

C'était un stage avec perl 5.8.x. Le titre du chapitre : les limites des regex.

A+, crabs
0
Utilisateur anonyme
23 oct. 2005 à 18:27
supaire!

merci meussieuche :)

ça va m'enlever une épine du pied.

Et puis ça dissipe mon doute sur le fait qu'il existerait une solution mais qu'elle m'aurait échappé, comme ça je ne passerai pas la nuit à chercher pour rien
0