Expressions régulières

Une expression régulière est une représentation de différents chaînes de caractères. C’est très utile car cela permet par exemple de faire des recherches dans des fichiers.
Et suivant l’outil que vous allez utiliser cela peut être très rapide même sur de gros fichiers.

De nombreux outils utilisent les expressions régulières, VI, SED, GREP, FIND, AWK … et presque tout les langages de développement (PHP, PERL, PYTHON…)

Un métacaractère est un caractère particulier qui permet de « représenter » un autre caractère ou groupe de caractères.

Pour échapper un caractère on utilise \, par exemple vous voulez chercher le caractère * (qui est un métacaractère) vous ne pouvez pas l’utiliser tel quel vous devez l’échapper avec le caractère \ cela donne\*

La métacaractère .

Le . (point) représente un caractère unique. (sauf le retour à la ligne)
Par exemple : si vous recherchez
toto.
Le résultat pourra être toto0, toto3, totot, totoZ … n’importe quel caractère après toto

Le métacaractère *

Représente 0 ou plus n’importe quel caractère.
Par exemple : a* représente a, aa, aaa, aaaa ….
Ainsi si vous combiner le . et l’* cela vous permet de rechercher n’importe quel caractère (y compris vide)
Cela donne : .*
En général dans les autres cas il risque de poser problème car pour reprendre l’exemple, si l’on entre a* il va retourner toutes les lignes (y compris les vides) donc pas très utile tel quel.

Le métacaractère ?

Il représente 0 ou 1 fois un caractère.
Par exemple : toto? représente toto ou totoo

Les métacaractère [ ]

Les crochets permettent de définir des éléments à trouver (ou l’inverse)
Par exemple : [dfgh] permet de chercher les caractères d, f, g, ou h.
Il est possible de définir des intervalles
Par exemple : [a-z] permet de chercher une lettre en minuscule
Et on peut combiner les intervalles
Par exemple : [a-zA-Z] une lettre en majuscule ou minuscule.
Le caractère ^ permet d’inverser les éléments à trouver.
Par exemple : [^a-zA-Z] pas une lettre
Attention il doit être placé au début des crochets car après il est considéré comme un élément à rechercher.
Par exemple : [0-9^] cherche les chiffres et le caractère ^
Autre exemple : a[b-d]e donne les résultats
abe, ace, ade
Plus compliqué : a[b-cB-C]d donne
abd, acd, aBd, aCd
Je vous laisse imaginé la puissance de l’outil….

Les caractères ^ et $

Ne pas confondre le ^ avec celui utilisé dans les intervalles.
Ici le caractère ^ signifie le début de la ligne et $ la fin.
Par exemple : ^a retourne toute les lignes commençant par a
Pour le caractère $ c’est pareil mais avec les fins de ligne
Par exemple : z$ retourne les lignes qui finissent par z
Ainsi si l’on recherche ^$ cela permet d’avoir toute les lignes vides 🙂

Le caractère |

Ce n’est pas un métacaractère, car il équivaux à ou.
Par exemple : toto|tata va chercher toto ou tata

Les sous chaînes

Dans le cadre de traitement complexe, on peut avoir à écrire une expression régulière et à l’utiliser plusieurs fois par le suite. Pour cela on va faire des sous chaîne.
Pour cela on fait : \ ([a-zA-Z]*)\ puis pour rappeler l’expression on utilise \ 1 à l’endroit où on veut l’utiliser.

Les répétitions

Si vous voulez chercher plusieurs fois un motif, vous devez entrer plusieurs fois le motif à chercher, c’est long et laborieux. Il y a un moyen plus simple : les répétitions.
Par exemple : vous voulez chercher des mots qui correspond à tot suivi de 3 lettres … le motif serait un truc du genre :
tot[a-zA-Z][a-zA-Z][a-zA-Z] pas terrible. on va utiliser une méthode qui permet de répéter le motif. Cela donnerez :
tot[a-zA-Z]{3} c’est plus élégant 🙂
Le {3} permet de répéter 3 fois le motif. En fait l’utilisation des répétitions est un peu plus complexe. La forme complète est {minimum, maximum}
Ainsi si l’on rentre : tot[a-zA-Z]{4,6} on va chercher tot et entre 4 et 6 caractères après.
Vous avez peut être remarqué que ? permet de faire 0 ou 1 répétition, c’est un raccourci en fait. l’équivalent avec les caractères de répétition est : {,1}
Le caractère + permet de faire 1 ou plusieurs répétitions et sont équivalent est {1,}

Les classes de caractères

Afin de facilité l’écriture des expressions relationnels il est possible d’utiliser des classes de caractères, elles permettent de regrouper un ensemble de caractères.
Par exemple pour rechercher toutes les lettres : [:alpha:]

Classe Descriptionéquivalent
[:space:]Espace ou séparateur de ligne ou de paragraphe[ \t\r\n\v\f] (il y a un espace)
[:blank:]Espace ou tabulation [ \t] (il y a un espace)
[:punct:]Les caractères de ponctuation[!"#$%&'()*+,-.\/:;?@[\\\]_`{|}~]
[:alnum:]Caractère alphanumérique[0-9a-ZA-Z]
[:digit:]Chiffre [0-9]
[:xdigit:]Caractère hexadécimal[0-9a-fA-F]
[:alpha:]Lettre minuscule et majuscule[a-zA-Z]
[:lower:]Lettre minuscule[a-z]
[:upper:]Lettre majuscule[A-Z]

Il y en a d’autre mais ils sont peu utilisés.

Construction d’une expression régulière pas à pas :

On va chercher un numéro de téléphone Français de base (pas de numéros spéciaux)
On commence par dire que l’on veux uniquement ce qu’il y aura entre notre recherche, donc ce délimiter la recherche par
^ et $Puis le premier nombre sera un 0 on a donc :
^0$
Le deuxième nombre est un nombre compris entre 1 et 5 :
^0[1-5]$
Puis on a 8 chiffres de 0 à 9 donc [0-9]{8} cela donne :
^0[1-5][0-9]{8}$
Voila, c’est plus simple qu’il n’y parait, même s’il est plus simple de les écrire que de comprendre des expressions écrient par d’autre. D’où l’importance de commenter vos codes.

Échappement spéciaux

Comme nous l’avons vu, il est nécessaire de d’échapper certain caractère car ils ont une signification dans les expressions régulières.
Par exemple si vous voulez rechercher un ? vous ne pouvez pas le mettre comme cela dans l’expression, pour l’échapper il faut utiliser \? (antislash)
Il existe des échappements particuliers, par exemple pour chercher des saut de ligne, ou des tabulations.

SéquenceDescription
\bretour arrière
\ttabulation
\nsaut de ligne
\vtabulation vertical
\fsaut de page
\rretour chariot

Quelques expressions notables :

Ici vous trouverez quelques expressions prêtes à l’emploi.
Pour rechercher des mails : les motifs que l’on recherche sont des lettres et chiffres ainsi que les caractères . – et _ suivie de @ puis de lettres et chiffres plus les . – et _ suivi d’un point et de 2 à 6 caractères, cela donne :
^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,6}$

Pour rechercher un numéro en France : on cherche un motif de 10 caractères commençant par 0 puis un chiffre de 1 à 9 suivi de 8 chiffres.
Cela donne :
^(0|\+33)[1-9][0-9]{8}$

Pour rechercher des adresse web :
Une adresse web est constituée par :
http:// ou https://
puis peut être un sous domaine suivi d’un point
Puis du domaine suivi d’un point
Un TLD (extension en .com, .org …) de 2 à 5 caractère en général mais avec les nouveaux TLD cela tend à augmenter.

Cela donne :
^http(s)?://[-[:alnum:]]+\.[-[:alnum:]]+\.[a-zA-Z]{2,5}
Il est possible de l'améliorer.

A quoi cela va nous servir ?

A vous simplifier la vie 🙂
Avec grep vous pouvez faire des recherches poussées dans les logs
Avec PERL ou d’autres langages vous pourrez chercher, trier … un grand nombre de données.

Liens utiles

Site pour tester vos expressions régulières rubular
Page wikipedia sur les expressions régulières
Sources d’informations :
edutechwiki
phpcodeur
shellunix