Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

chaìne qui chevauche

2 réponses
Avatar
nicolas_laurent545
Bonjour

J'aimerais savoir si on peut =E0 l'aide d'une expression r=E9guli=E8re
comparer deux mots pour effacer la partie qui chevauche. Ainsi, si on
a:

Pierrre =3D=3D> Pierette, Pierreta, Pierrina =3D tte,ta,ina
Raymond =3D=3D> Raymonde, Raymonda, Raymondina =3D e,a,ina
Ren=E9 =3D=3D> Ren=E9e =3D e
Claude =3D=3D> Claude, Claudette =3D tte

Je voudrais utiliser cette expression reguli=E8re sous forme de commande
perl.

Merci de votre aide

2 réponses

Avatar
Paul Gaborit
À (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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
jl_morel
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