chaìne qui chevauche

Le
nicolas_laurent545
Bonjour

J'aimerais savoir si on peut à l'aide d'une expression régulière
comparer deux mots pour effacer la partie qui chevauche. Ainsi, si on
a:

Pierrre ==> Pierette, Pierreta, Pierrina = tte,ta,ina
Raymond ==> Raymonde, Raymonda, Raymondina = e,a,ina
René ==> Renée = e
Claude ==> Claude, Claudette = tte

Je voudrais utiliser cette expression regulière sous forme de commande
perl.

Merci de votre aide
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #143789
À (at) 12 Apr 2007 15:00:46 -0700,
écrivait (wrote):
J'aimerais savoir si on peut à l'aide d'une expression régulière
comparer deux mots pour effacer la partie qui chevauche. Ainsi, si on
a:

Pierrre ==> Pierette, Pierreta, Pierrina = tte,ta,ina
Raymond ==> Raymonde, Raymonda, Raymondina = e,a,ina
René ==> Renée = e
Claude ==> Claude, Claudette = tte

Je voudrais utiliser cette expression regulière sous forme de commande
perl.


On peut faire un truc comme ça :

my $mot = "Pierre"; # par exemple
my $exp = "";
foreach my $l (1..length $mot) {
$exp = substr($mot,0,$l) . "|$exp";
}
$exp = qr/($exp)/;
print "$expn"; # pour voir à quoi ça ressemble...

$mots = "Pierette, Pierreta, Pierrina";
$mots =~ s/$exp//g;

print "$motsn";

qui affiche :

ette, ta, ina

(J'ai laissé le 'Pierette' avec un seul 'r'.)

Ça marche bien si $mot ne contient pas de caractères ayant un sens
spécial pour les regexp. Sinon, il faudra utiliser en plus des appels
à quotemeta() ou à Q..E.

--
Paul Gaborit - Perl en français -
jl_morel
Le #143687
Dans l'article a dit...

J'aimerais savoir si on peut à l'aide d'une expression régulière
comparer deux mots pour effacer la partie qui chevauche. Ainsi, si on
a:

Pierrre ==> Pierette, Pierreta, Pierrina = tte,ta,ina
Raymond ==> Raymonde, Raymonda, Raymondina = e,a,ina
René ==> Renée = e
Claude ==> Claude, Claudette = tte



Si les mots sont séparés par une espace dans la chaine, on peut faire ça :
(si les mots ne se chevauchent pas, la chaine n'est pas modifiée)

#!/usr/bin/perl
use strict;
use warnings;

my $s = "Raymonde Raymonda Raymondina";

my $reg = '(S+)'.'.* 1' x $s=~tr/ / /; # regexp paramétrée
$s =~ s/$1//g if $s =~ /$reg/;

print $s; # renvoie la chaine "e a ina"

__END__

HTH
--
J-L.M.
http://www.bribes.org/perl

Publicité
Poster une réponse
Anonyme