OVH Cloud OVH Cloud

overlap et expression reguliere

4 réponses
Avatar
fred78980
Bonjour

J'ai =E9cris ce petit programme afin de remplacer des cha=EEnes qui se
partagent les m=EAmes caract=E8res comme ooo et oooo. Comment rendre la
RE strict de fa=E7on a ce que ce petit programme me donne ooos en vertu
de l'application de la premiere r=E8gle seulement.


$a=3Dooo;
$b=3Doooo;
$a=3D~ s/ooo/ooos/g; #RE1
$b=3D~ s/ooooo/ooos/g;#RE2
print $a;
print $b;

Merci

4 réponses

Avatar
Jérémy JUST
On 4 May 2005 10:26:03 -0700
wrote:

J'ai écris ce petit programme afin de remplacer des chaînes qui se
partagent les mêmes caractères comme ooo et oooo. Comment rendre la
RE strict de façon a ce que ce petit programme me donne ooos en vertu
de l'application de la premiere règle seulement.


Je ne comprends pas bien ton explication. Tes chaînes « oooo » sont
bien des séries de « o », ou bien elles représentent quelque chose de
plus compliqué?


$a=~ s/ooo/ooos/g; #RE1
$b=~ s/ooooo/ooos/g;#RE2


Est-ce que ça répondrait à ton problème d'utiliser la valeur de retour
de s/// pour décider que tu appliques la seconde regexp?

$a=~s/ooo/ooos/g or $b=~s/ooooo/ooos/g

Sinon, quelque chose comme ça:

$b=~s/o{3}|o{5}/ooos/g
^^^^^^^^^
L'ordre des termes de l'alternative définit une priorité
(le premier qui matche est utilisé, quelle que soit sa longueur)


Si j'ai répondu à côté de la plaque, précise ton problème, avec un
exemple plus explicite.

--
Jérémy JUST

Avatar
nospamthanx
wrote:

Bonjour

J'ai écris ce petit programme afin de remplacer des chaînes qui se
partagent les mêmes caractères comme ooo et oooo. Comment rendre la
RE strict de façon a ce que ce petit programme me donne ooos en vertu
de l'application de la premiere règle seulement.


$a=ooo;
$b=oooo;
$a=~ s/ooo/ooos/g; #RE1
$b=~ s/ooooo/ooos/g;#RE2
print $a;
print $b;

Merci


La question n'est pas très explicite...
Tu veux faire quoi au juste ? Que 'ooo' devienne 'ooos' seulement si
'ooo' n'est pas suivi d'un autre 'o' ???

Dans ce cas, penser au test avant négatif, "(?! )", illustré ci-dessous:
$a =~ s/ooo(?!o)/ooos/g;

Attention aux effets de bord, si $a='oooo', la subsitution donnera
'oooos' puisque les 3 derniers 'o' répondent au motif.
Ainsi, si tu veux remplacer 'ooo' par 'ooos' à condition qu'il n'y ait
que trois 'o' qui soient répétés (c'est peut-être ce que tu appelles
"rendre la RE stricte" ?) alors il faut ajouter un test arrière négatif:
$a =~ s/(?<!o)ooo(?!o)/ooos/g;

Note au passage que cette expression s'exécutera plus rapidement que
$a =~ s/(?<!o)o{3}(?!o)/ooos/g;
qu'il vaut mieux éviter dans ce cas.

Avatar
Paul Gaborit
À (at) Thu, 5 May 2005 13:03:11 +0200,
Jérémy JUST écrivait (wrote):
Sinon, quelque chose comme ça:

$b=~s/o{3}|o{5}/ooos/g
^^^^^^^^^
L'ordre des termes de l'alternative définit une priorité
(le premier qui matche est utilisé, quelle que soit sa longueur)


Et dans ce cas particulier, l'application de la règle sus-citée rend la
deuxième partie de l'alternative totalement inutile. C'est donc équivalent
à :

$b =~ s/o{3}/ooos/g;

Pour le reste, attendons que le PO précise sa question...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Jérémy JUST
On Mon, 09 May 2005 12:07:43 +0200
Paul Gaborit wrote:

Et dans ce cas particulier, l'application de la règle sus-citée rend
la deuxième partie de l'alternative totalement inutile.


Oups, oui. Dans mon écriture avec « or » aussi, d'ailleurs.
J'ai dû me laisser trop influencer par l'exemple du PO.


Merci pour la rectification.


--
Jérémy JUST