Il est fréquent que l'on doive reconnaître dans un texte la présence d'expressions respectant un certain modèle. Le cas typique est la reconnaissance d'une adresse mail : On voudrait reconnaître quelque chose comme :
[des lettres, chiffres et points]@[au moins 3 lettres].[2 ou 3 lettres].
C'est le domaine des expressions régulières. L'expression régulière correspondant à ce qui est écrit au dessus serait :
[A-Za-z0-9.]+@[A-Za-z]{3,}.[A-Za-z]{2,3}
Notre but ici sera de produire un programme capable de reconnaître si une chaîne de caractère respecte une expression régulière très simple.
soit l'expression "(aa*|b)c".
a signifie : exactement un aa* signifie : un nombre quelconque de aaa* signifie : un a suivi d'un nombre quelconque de ab signifie : exactement un baa*|b signifie : soit un a suivi d'un nombre quelconque de a, soit exactement un b"(aa*|b)c" signifie : (soit un a suivi d'un nombre quelconque de a, soit exactement un b) le tout suivi d'exactement un c.Voici quelques exemples qui valident l'expression ou non :
"aaaaaaaaac" → oui"aaaaaaaaa" → non"c" → non"ac" → oui"bc" → oui"aaabc" → non"acc" → non"bbc" → nonPour modéliser l'expression, on réalise un automate qui a la forme d'un graphe. Voici le graphe pour le cas précédent.
Le graphe étant défini, on se demande si une certaine chaîne est valide. Par exemple "aac" est-elle valide (la réponse devrait être oui).
car se caractère.car.
Test de la chaîne "aac".
a, on note le(s) nœud(s) pouvant être atteint(s) par une arête étiquetée a,a, on note le(s) nœud(s) pouvant être atteint(s),c, on note le(s) nœud(s) pouvant être atteint(s),"aac" valide l'expression régulière dont le graphe est une représentation.On se demande ici comment on peut obtenir le graphe.
La méthode consiste à créer des graphes élémentaires puis à les assemble pour des expressions plus complexe.
On a deux expressions "exp1" et exp2" représentée par les graphes G1 (en bleu) et G2 (en violet).
On souhaite obtenir le graphe représentant le choix exp1 OU exp2, que l'on notera "exp1|exp2".
J'ai marqué en pointillé les nœuds initiaux et finaux de G1 et G2 qui cessent de l'être une fois intégrés dans le graphe complet.
On a une expression "exp" associée à son graphe g. On souhaite obtenir le graphe représentant la répétition indéterminée de "exp" ce que l'on notera "exp*".
On a deux expressions "exp1" et exp2" représentée par les graphes G1 (en bleu) et G2 (en violet).
On souhaite obtenir le graphe représentant la suite exp1 exp2 que l'on notera simplement "exp1exp2".
Pour vous entraîner, vous pouvez essayer d'appliquer ces règles pour retrouver le graphe de "(a*|b)c". Sachez cependant que l'application de ces règles de constructions peut conduire à ajouter des nœuds qui pourraient être supprimés. J'en ai supprimé pour alléger le graphe que j'ai donné en exemple. Vous n'obtiendrez donc pas exactement le même, mais ce sera tout comme.
| et le symbole étoile *, en utilisant les règles de construction ci-dessus.