1 Expressions régulières/rationnelles

publicité
1 Expressions régulières/rationnelles
1.1 Introduction
Les expressions rationnelles 1 sont des chaînes de caractères définissant des
langages réguliers 2 et utilisés pour reconnaître des motifs. De nombreux outils et
langages de programmation les utilisent pour des recherches et des modifications
de texte contextuelles avancées :
— Outils en ligne de commandes : grep, sed, awk, …
— Langages de scripts : perl, php, python, …
— Langages de programmation : java, c++, …
— Éditeurs de texte : vi, emacs, jEdit, …
— Traitements de texte : LibreOffice, …
Il existe de nombreuses variantes et dialectes, cependant il est possible de
distinguer deux grandes familles :
— Expression régulière POSIX : l’objectif avec ce standard est de répondre
à la problématique de la multiplication des syntaxe.
— PCRE (Perl-Compatible Regular Expression) : Perl est un langage proposant nativement un traitement puissant des expressions régulière. L’ensemble de fonctionnalités disponible a été implémenté dans une bibliothèque à laquelle Il est possible de faire appel dans d’autre contextes.
De manière transversale, les expressions régulières sont utilisées soit pour
effectuer une recherche de motif, soit pour remplacer un motif par une chaîne
de caractère. Les fonctions ont donc la forme suivante :
— trouve(regex,texte) → booléen
La fonction trouve retourne vrai si le motif regex se trouve dans la
chaîne de caractères texte (il est alors possible de récupérer lla partie
de la chaine reconnue par le motif).
— remplace(regex,chaîne,texte) → chaîne de caractères
La fonction remplace retourne une chaîne de caractères où les occurrences du motif regex dans la chaîne de caractères texte ont été remplacées par la chaîne.
On trouve aussi dans les langages de programmation :
— découpe(regex,texte) → tableau
Cette fonction découpe la chaîne texte par rapport au motif regex, le
résultat est stocké dans un tableau de chaîne de caractères.
1.2 Principe sous-jacent
La reconnaissance de motif se fait à l’aide d’un diagramme de transition. Sa
mise en œuvre se fait à l’aide d’automates finis déterministes (AFD) avec un
état initial et un ou plusieurs états finaux. Le principe est le suivant :
1. l’état courant est l’état initial
1. Appelées au départ improprement expressions régulières le terme est entré dans le langage courant.
2. Il existe de nombreux langages, chacun avec leur spécificités et leurs limites.
1
2. lecture du caractère suivant dans la chaîne d’entrée
3. si il existe un chemin (arc) dont l’étiquette correspond au caractère alors
changer l’état courant avec le nouvel état
— si l’état courant est un état final alors le motif est reconnu
4. sinon l’état courant est l’état initial
5. retourner à l’étape 2
La figure 1 montre le déroulement du processus. L’état courant est en violet, les
états finaux en gris. Le vert indique les parties de textes reconnues par le motif.
1.3 Syntaxe
La syntaxe des expressions régulières s’exprime non pas sous formes de mots
clefs mais à partir de caractères, par conséquent un certain nombre de ces caractères sont réservés car possédant un sens particulier :
( ) [ ] { } . *? + ^ $ |
Le caractère \ permet de les dé-spécialiser (ainsi \* désigne le caractère étoile
alors que * est un opérateur) ou d’accéder à des caractères non imprimables (par
exemple la tabulation).
Classe de caractères [aeiouy] reconnaît les voyelles
[ˆaeiouy] reconnaît tous les caractères qui ne sont pas des voyelles : p.
ex. 7 é n ; ’+
[0-9] reconnaît les chiffres
[A-z] reconnaît tous les caractères entre A et z donc les caractères entre
Z(90) et a(97)
Classes prédéfinies \d ou [:digit:] tout caractère numérique : 0, 1, 2,
3, 4, 5, 6, 7, 8, 9
\w ou [:alnum:] (word metacharacter) une lettre [a-z] [A-Z], un chiffre
[0-9]
\s ou [:space:] (whitespace metacharacter) espace, tabulation, saut
de ligne, ou tout autre caractère non imprimable
\b (word boundary metacharacter) espace, ponctuation, le début du texte,
la fin du texte
Caractère quelconque . reconnaît n’importe quel caractère sauf fin de
ligne \r et \n
Début/fin de ligne Pour les outils en ligne de commande, l’unité pour la
recherche de motif est la ligne, dans les langages de programmation, c’est
la chaîne de caractère.
ˆA reconnaît toutes les lignes / chaînes commençant par un A
A$ reconnaît toutes les lignes / chaînes terminant par un A
Choix | permet d’exprimer une alternative
2
7
x
8
7
u
0
c
1
h
2
e
3
v
4
a
5
0
l
c
1
h
2
e
3
v
4
a
7
l
x
1
h
2
e
3
v
4
a
7
0
c
1
h
2
e
3
v
4
a
7
l
x
1
h
2
e
3
v
4
a
7
0
c
1
h
2
e
3
v
4
a
7
l
x
1
h
2
e
3
v
4
a
7
0
c
1
h
2
e
3
v
4
a
7
l
x
1
h
2
e
3
v
4
a
7
0
c
1
h
2
e
3
v
4
a
7
l
x
1
h
2
e
3
v
4
a
7
x
8
u
5
0
l
6
le_chevalier_regarde_les_chevaux galoper
8
u
c
8
5
6
le_chevalier_regarde_les_chevaux galoper
0
x
u
5
l
6
le_chevalier regarde les chevaux galoper
8
u
c
8
5
6
le_chevalier regarde les chevaux galoper
0
x
u
5
l
6
le_chevalier regarde les chevaux galoper
8
u
c
8
5
6
le_chevalier regarde les chevaux galoper
0
x
u
5
l
6
le_chevalier regarde les chevaux galoper
8
u
c
8
5
6
le_chevalier regarde les chevaux galoper
0
x
u
5
l
6
le_chevalier regarde les chevaux galoper
8
u
c
8
5
6
le chevalier regarde les chevaux galoper
0
x
u
c
1
h
2
e
3
v
4
a
5
l
6
le_chevalier_regarde_les_chevaux galoper
le_chevalier_regarde_les_chevaux_galoper
Figure 1 – Reconnaissance à partir de l’automate cheva(l|ux)
Opérateurs de répétition Les opérateurs s’appliquent au caractère qui le
précède.
? 0 ou 1 fois
* 0 ou n fois
+ 1 ou n fois
{n} exactement n fois
3
6
{n,} au moins n fois
{,n} au plus n fois
{n,m} au moins n fois à au plus m fois
Par défaut les moteurs d’expressions régulières cherchent à maximiser
le motif reconnu par une expression régulière L’ajout à l’opérateur du
symbole ? permet au contraire de minimiser le motif reconnu
Parenthèses : groupement et mémorisation Les parenthèse ont une double
signification,elles permettent d’une part d’appliquer un opérateur sur plusieurs caractère, et d’autre part de mémoriser une partie les motifs reconnus afin de les réutiliser ultérieurement dans la partie remplacement.
La référence aux parenthèses se fait par rapport à leur numéro d’ordre
préfixé par $ ou par \\
4
Téléchargement