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

Besoin d'aide pour la compréhension d'expression conditionnelle regex

2 réponses
Avatar
ctobini
Bonjour,

Je suis en train de suivre un tutoriel dont voici le lien
http://perl.enstimac.fr/DocFr/perlretut.html#les%20regroupements%20sans%20m=
%E9morisation.

J'ai un petit soucis avec un exemple sur les expressions
conditionnelles :

Selon le tuto, les expressions s'utilisent comme suit :

(?(condition)motif-oui) et (?(condition)motif-oui|motif-non)

Avec un exemple :

La premi=E8re forme de la condition nous permet de choisir, avec plus de
flexibilit=E9, ce que l'on veut reconna=EEtre en fonction de ce qui a d=E9j=
=E0
=E9t=E9 reconnu. L'exemple suivant cherche les mots de la forme "$x$x" ou
"$x$y$y$x" :

% simple_grep '^(\w+)(\w+)?(?(2)\2\1|\1)$' /usr/dict/words
beriberi
deed

Ce que je ne comprends pas :

- si motif-oui et motif-non sont des motifs de substitution selon la
condition

- l'exemple du script simple_grep :
le '?' pr=E9c=E9dant les motifs ou et non
la condition (2)
le fait que (\w+)(\w+) ne reconnaisse pas une r=E9p=E9tition (beriberi)
mais un mot + sa derni=E8re lettre
(beriber + i) la regex fait-elle une substitution ou renvoie-t-elle
une valeur ?

Merci si vous pouvez m'aiguiller parce que ce cas m'embrouille
compl=E9tement :-)

C=2E Tobini

2 réponses

Avatar
Paul Gaborit
À (at) Mon, 23 Jul 2007 02:58:52 -0700,
ctobini écrivait (wrote):
Je suis en train de suivre un tutoriel dont voici le lien
http://perl.enstimac.fr/DocFr/perlretut.html#les%20regroupements%20sans%20m%E9morisation.

J'ai un petit soucis avec un exemple sur les expressions
conditionnelles :

Selon le tuto, les expressions s'utilisent comme suit :

(?(condition)motif-oui) et (?(condition)motif-oui|motif-non)

Avec un exemple :

La première forme de la condition nous permet de choisir, avec plus de
flexibilité, ce que l'on veut reconnaître en fonction de ce qui a déjà
été reconnu. L'exemple suivant cherche les mots de la forme "$x$x" ou
"$x$y$y$x" :

% simple_grep '^(w+)(w+)?(?(2)21|1)$' /usr/dict/words
beriberi
deed

Ce que je ne comprends pas :

- si motif-oui et motif-non sont des motifs de substitution selon la
condition


motif-oui et motif-non sont des choses à reconnaître (comme le reste
de l'expression rationnelle). Mais le moteur de regexp essayera de
reconnaître l'un ou l'autre selon la condition.


- l'exemple du script simple_grep :
le '?' précédant les motifs ou et non


Le '?' a plusieurs de sens différent dans les expressions rationnelles
de Perl. Dans l'expression ci-dessus, le premier '?' a son sens le
plus habituel : il permet d'indiquer que le motif précédent (ici
'(w+)') doit être reconnu 0 ou 1 fois.

Le deuxième '?' a un sens plus spécifique à Perl puisqu'il suit une
parenthèse ouvrante : il permet d'introduire une extension aux
expressions rationnelles traditionnelles.

Comme il est dit dans 'perlre' : « Le point d'interrogation a été
choisi pour les extensions ainsi que pour les modificateurs non
gourmands parce que 1) les points d'interrogation sont rares dans les
vieilles expressions rationnelles et 2) pour qu'à chaque fois que vous
en voyez un, vous vous arrêtiez pour vous ``interroger'' sur son
comportement. C'est psychologique... »

la condition (2)


Lorsque la condition est un entier entre parenthèses, la condition est
vraie si la groupe mémorisé correspondant n'est pas vide.

le fait que (w+)(w+) ne reconnaisse pas une répétition (beriberi)
mais un mot + sa dernière lettre


Appliqué à la ligne contenant beriberi, on a les reconnaissances
suivantes :

^ ==> le début de la ligne
(w+) => les lettres 'beri' (c'est 1)
(w+)? => rien du tout (2 est donc vide)
(2) => la condition est fause puisque 2 est vide
1 => reconnaît à nouveau 'beri'
$ => reconnaît la fin de ligne (en fait juste avant le passage à la ligne)

(beriber + i) la regex fait-elle une substitution ou renvoie-t-elle
une valeur ?


Un motif d'expression rationnelle ne fait jamais de substitution (en
fait, il ne modifie jamais le texte auquel on l'applique).

Il n'y a que lorsqu'on utilise une expression rationnelle avec
l'opérateur 's/.../.../' qu'il y a des substitutions. Mais
l'expression rationnelle est à gauche et le texte de remplacement est
à droite.

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

Avatar
ctobini
Bonjour et merci de votre réponse,

Je n'avais pas compris que la condition (2) pouvait valoir pour $2 et
2 selon le motif oui-non, et que oui-non valais comme suite du motif
de départ selon la condition.

Il faut dire que c'est une utilisation des regex qui est assez peu
intuitive mais sacrément puissante quand on l'a (un peu) assimilée !

Merci et bonne journée,

C. Tobini

On 23 juil, 14:16, Paul Gaborit wrote:
À (at) Mon, 23 Jul 2007 02:58:52 -0700,
ctobini écrivait (wrote):



Je suis en train de suivre un tutoriel dont voici le lien
http://perl.enstimac.fr/DocFr/perlretut.html#les%20regroupements%20sa....

J'ai un petit soucis avec un exemple sur les expressions
conditionnelles :

Selon le tuto, les expressions s'utilisent comme suit :

(?(condition)motif-oui) et (?(condition)motif-oui|motif-non)

Avec un exemple :

La première forme de la condition nous permet de choisir, avec plus de
flexibilité, ce que l'on veut reconnaître en fonction de ce qui a d éjà
été reconnu. L'exemple suivant cherche les mots de la forme "$x$x" ou
"$x$y$y$x" :

% simple_grep '^(w+)(w+)?(?(2)21|1)$' /usr/dict/words
beriberi
deed

Ce que je ne comprends pas :

- si motif-oui et motif-non sont des motifs de substitution selon la
condition


motif-oui et motif-non sont des choses à reconnaître (comme le reste
de l'expression rationnelle). Mais le moteur de regexp essayera de
reconnaître l'un ou l'autre selon la condition.

- l'exemple du script simple_grep :
le '?' précédant les motifs ou et non


Le '?' a plusieurs de sens différent dans les expressions rationnelles
de Perl. Dans l'expression ci-dessus, le premier '?' a son sens le
plus habituel : il permet d'indiquer que le motif précédent (ici
'(w+)') doit être reconnu 0 ou 1 fois.

Le deuxième '?' a un sens plus spécifique à Perl puisqu'il suit une
parenthèse ouvrante : il permet d'introduire une extension aux
expressions rationnelles traditionnelles.

Comme il est dit dans 'perlre' : « Le point d'interrogation a été
choisi pour les extensions ainsi que pour les modificateurs non
gourmands parce que 1) les points d'interrogation sont rares dans les
vieilles expressions rationnelles et 2) pour qu'à chaque fois que vous
en voyez un, vous vous arrêtiez pour vous ``interroger'' sur son
comportement. C'est psychologique... »

la condition (2)


Lorsque la condition est un entier entre parenthèses, la condition est
vraie si la groupe mémorisé correspondant n'est pas vide.

le fait que (w+)(w+) ne reconnaisse pas une répétition (beriber i)
mais un mot + sa dernière lettre


Appliqué à la ligne contenant beriberi, on a les reconnaissances
suivantes :

^ ==> le début de la ligne
(w+) => les lettres 'beri' (c'est 1)
(w+)? => rien du tout (2 est donc vide)
(2) => la condition est fause puisque 2 est vide
1 => reconnaît à nouveau 'beri'
$ => reconnaît la fin de ligne (en fait juste avant le passage à la ligne)

(beriber + i) la regex fait-elle une substitution ou renvoie-t-elle
une valeur ?


Un motif d'expression rationnelle ne fait jamais de substitution (en
fait, il ne modifie jamais le texte auquel on l'applique).

Il n'y a que lorsqu'on utilise une expression rationnelle avec
l'opérateur 's/.../.../' qu'il y a des substitutions. Mais
l'expression rationnelle est à gauche et le texte de remplacement est
à droite.

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