RegEx, sa vie, son histoire, son oeuvre

Expressions Régulières

Les expressions régulières, nos chères RegEx permettent de représenter des modèles de chaînes de caractère.

Cependant, si cet outil est très puissant, il est relativement difficile à appréhender au début car les expressions régulières peuvent prendre des formes de ce genre :

#^[a-zA-Z-]+@[a-zA-Z-]+\.[a-zA-Z]{2,6}$#

Cet expression régulière permettant, par exemple, de représenter toutes les adresses emails contenues dans un texte. Vous pouvez donc voir que la syntaxe est tellement aisée à comprendre que on va voir tout ça en quelques lignes… dizaines… de milliers hein…..

Regex de base

Les caractères de début et fin de chaîne

Les caractères de début et de fin de chaîne, respectivement ^ et $, représentent, comme leur nom l’indique, le début et la fin de la chaîne.

Rechercher un mot ou un caractère en début, ici le mot assez s’écrira « ^assez » et en fin « $assez », tout simplement.

Le caractères OU

L’opérateur OU s’écrit simplement avec le pipe ou |

Bonjour|revoir

Il est aussi possible de sélectionner les occurrences du mot Bonjour se trouvant au début du texte et du mot revoir se trouvant à la fin, ce qui revient à fusionner, en les séparant par une barre verticale. Voici donc la regex correspondant :

^Bonjour|revoir$

Les ensembles de caractères

Un ensemble de caractère est délimité par des crochets dans lesquels se trouvent les caractères faisant parti d’un OU.

t[aeiou]

Cette regex peut être expliciter par la phrase suivante : « Sélectionne les parties du texte où il y a un m t, suivi d’un a ou e, oui ou o ou u.

Encore mieux, nous pouvons faire la même chose mais de façon négative, si je veut avoir les parties de texte où il y a un t qui n’est pas suivi par un e ou un a ou un o j’écrirai :

t[^oae]

Imaginons que nous voulons sélectionner tous les mots commençant par un m, suivi de n’importe quelle lettre, suivi d’un t, suivi d’un s. La regex qui nous viendrait à l’esprit serait une regex de ce type :

m[abcdefghijklmnopqrstuvwxyz]ts

La regex serait donc longue et fastidieuse à écrire, surtout que pour celle-ci, seules les minuscules ont été sélectionnées ! Heureusement, un moyen plus simple existe pour écrire de telles regex : cela s’appelle les intervalles et se note [debut intervallefin intervalle]. Voici quelques petites exemples :

Intervalle Equivalent Traduction
[a-z] [abcdefghijklmonpqrstuvwxyz] Lettres minuscules de a à z
[A-Z] [ABCDEFGHIJKLMNOPQRSTUVWXYZ] Lettres majuscules de A à Z
[0-9] [0123456789] Chiffres de 0 à 9
[a-z0-9] [abcdefghijklmonpqrstuvwxyz0123456789] Lettres minuscules de a à z ou chiffres de 0 à 9

Reprenons donc notre regex et utilisons les intervalles. Nous obtenons alors :

m[a-z]ts

Les ensembles préconçus

Un ensemble préconçu est une façon très simple de représenter plusieurs intervalles. Voici quelques exemples :

Ensemble Equivalent
. Absolument n’importe quel caractère
\w [a-zA-Z0-9_]
\d [0-9]
\n Un retour à la ligne
\t Une tabulation

Ainsi, cette regex :

m\wts

sélectionnera les mêmes éléments que notre exmple précédent, le caractère blanc en plus.

m[a-zA-Z0-9_]ts

Les quantificateurs

Nous venons de voir qu’un ensemble de caractères permet de définir de manière très simple les valeurs possible d’un caractère. Mais qu’en est-il si l’on définir les mêmes valeurs possibles pour plusieurs caractères ? Par exemple, si l’on veut sélectionner les parties du texte où il y a un m, suivi d’un a, suivi de 3 fois n’importe quelle lettre minuscule, est-on obligé d’utiliser une regex de ce type :

ma[a-z][a-z][a-z]

Non. Il existe une méthode plus simple qui consiste à utiliser les quantificateurs : ce sont des caractères qui indiquent le nombre de répétition du caractère ou de la suite de caractère qui les précèdent. Le quantificateur, dans sa forme explicite, peut s’écrire de 4 façons :

  • {min,max} : le nombre de répétition varie entre la valeur minimale et la valeur maximale incluses
  • {min,} : le nombre de répétition varie entre la valeur minimale incluse et l’infini
  • {,max} : le nombre de répétition varie entre 0 et la valeur maximale incluse
  • {nombre} : le nombre de répétition correspond au nombre marqué entre les accolades

Par exemple, la regex suivante :

[a-zA-Z]{6}

permet de sélectionner les parties du texte où il y a 6 lettres consécutives. Celle-ci :

[0-9]{2,4}

permet de sélectionner les parties du texte où il y a entre 2 et 4 chiffres consécutifs. Comme pour les ensembles de caractères, il existe aussi des quantificateurs préconçus. En voici la liste :

Quantificateur Traduction Équivalent
* 0 ou plusieurs répétitions {0,}
+ 1 ou plusieurs répétitions {1,}
? 0 ou 1 répétition {,1}

Attention pour pouvoir utiliser un caractère dans une regex, comme le point par exemple, mais qu’il soit considéré comme un point mais pas comme son équivalent ( soit tout caractère), il faut utiliser le caractère d’échappement, idem que pour les String classique le \.

Donc pour créer une regex de tri de recherche de mail de type mister.smith@********, le code serais :

mister.smith\.@[a-z]\.[a-z]

 

Voila, un petit tour rapide sur les regex, j’espère avoir été clair et pas trop concis en même temps, et pour en voir plus et approfondir le sujet n’hésitez pas c’est par ICI et par LA.

Une pensée sur “RegEx, sa vie, son histoire, son oeuvre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

%d blogueurs aiment cette page :