Menu Fermer

Guide d’utilisation des expressions régulières (regex)

Les expressions régulières (également appelées regex) sont de puissants outils de traitement de chaînes de caractères qui vous permettent de faire correspondre, de capturer et même de modifier différents fragments d’une chaînes.
Ils sont de loin l’un des outils les plus utiles dans la programmation, le traitement des données, le filtrage des données et même un aspect clé des outils de traitement de données avancés comme grep, sed ou AWK.
Mais on peut aussi les utiliser dans les bases de données (MySQL, Oracle, …) ou encore en programmation (PHP, Python, Perl, …)

Ce tutoriel vous guide pour utiliser les expressions régulières avec de nombreux exemples.

Guide d'utilisation des expressions régulières (regex)

A quoi servent les expressions régulières

Les expressions régulières permettent de faire correspondre une une chaîne de caractères à un texte.
Pour cela, on fournit un motif ou pattern que l’on soumet à cette chaîne de caractère.
Cela afin de :

  • Identifier du texte ou des parties de texte
  • Chercher dans du texte
  • Transformer du texte, par exemple pour faire du chercher et remplacer

Une expression régulière est un modèle qui décrit un ensemble de chaînes. Les expressions régulières sont construites de manière analogue aux expressions arithmétiques, en utilisant divers opérateurs pour combiner des expressions plus petites.

Il existe plusieurs versions différentes de la syntaxe des expressions régulières.
Les outils tels que grep ou sed peuvent en supporter plusieurs et on peut passer de l’une à l’autre par des options.

  • De base – Basic regular expression (BRE) – utilisé par la commande grep, sed
  • Etendue – Extended regular expression (ERE) – utilisé par la commande grep -E ou egrep, sed -E
  • Extensions GNU à POSIX
  • Perl compatible regular expression (PCRE) – utilisé avec grep -P

Guide d’utilisation des expressions régulières (regex)

Les motifs ou patterns

Le motif est l’élément que vous souhaitez chercher ou extraire.

Certains outils ou langage peuvent utiliser des délimiteurs pour encadrer un pattern comme par exemple /pattern/ ou $pattern$.
La plupart des outils et langages de programmation vous permettent généralement de choisir le symbole que vous souhaitez utiliser comme délimiteurs. D’autres langages de programmation, comme par exemple Python, n’exigent pas que vous enfermiez le motif dans deux délimiteurs.

Au délimiteur, on a applique un modificateur que l’on place à la fin.
Par exemple /motif/i indique de ne pas être sensible à la case.

Les Métacaractères

Les métacaractères sont des symboles réservés utilisés dans les expressions régulières pour accomplir différentes tâches.
Ils ne sont donc pas interprétés dans la recherche d’un pattern sauf s’ils sont échappés.

Par exemple, si vous voulez faire correspondre a$, vous devrez échapper le $ comme ceci : a\$

Les métacaractères sont : ^ $ * + ? { } [ ] \ | ( )
Vous en trouverez une description dans chacun des paragraphes de ce guide.

Littéraux et caractères jokers (wildcard)

Le type de correspondance de regex le plus basique sont les littéraux
Les littéraux sont des caractères réguliers et des nombres comme a, A, b, B, c, C, d, D… etc. 1, 2, 3, 4… etc. et aussi quelques symboles comme _, @, etc. symbole qui n’est pas un métacaractère). Lorsque vous écrivez un modèle en utilisant des littéraux, vous écrivez simplement exactement ce que vous voulez attraper. Par example:

  • Point d’interrogation ? ou le point . — un caractère quelconque
  • Étoile * — zéro, un ou plusieurs caractères. Attention ce dernier est plutôt en général un quantificateur

Par exemple :

  • *.docx va correspondre à tous les fichiers dont l’extension de fichier est docx
  • maison?.docx correspond au fichier maison avec n’importe quel caractère à la fin dont l’extension de fichier est docx : maisons.docx, maisona.docx, maisonb.docx maison1.docx, maison2,docx, …
  • “a.cd correspondra à “abcd”, “afcd”, “a cd”, “a1cd”, etc.

Les ancrages

Le caret ^ et le signe dollar $ sont des métacaractères qui correspondent respectivement à la chaîne vide au début et à la fin d’une ligne.

Imaginons que vous avez un fichier de configuration Linux avec des commentaires qui commencent par #, vous souhaitez faire ressortir les lignes avec ou sans commentaires.
Il faut donc retirer ou matcher les lignes qui commencent par #. On utilise pour cela le métacaractère ^.

Pour faire sortir toutes les lignes sans commentaires :

grep -v "^#" /etc/fichier.conf

Lister que les commantaires d’un fichier de configuration :

grep "^#" /etc/fichier.conf

Ou encore rechercher tous les mots qui commence par cri et finissent par al comme cristal, scriptural :

grep 'cri.*al$' /usr/share/dict/french

Enfin pour avoir les lignes se terminant par cristal :

grep 'cristal$' /usr/share/dict/french

Les intervalles

Les intervalles permettent de définir des plages de caractères.
Ils sont définis par un symbole – entre deux crochets : [ – ].

Classes de caractèresDescription
[a-z]Toutes les lettres minuscules
[A-Z]Toutes les lettres majuscules.
[a-zA-Z]Toutes les lettres minuscules et majuscules
[0-9]Tous les chiffres
[a-zA-Z0-9]Toutes les lettres minuscules, majuscules et chiffres.
Les intervalles de caractères dans les expressions régulières
  • Les plages peuvent être partielles. Par exemple, “[a-c]” correspondra à “a”, “b” ou “c” et “[1-3]” correspondra à “1”, “2” ou “3”.
  • ^[bc]ache fait correspondre vache ou cache mais seulement en début de ligne
  • [bc]ache$ est le motif pour faire correspondre vache ou cache en fin de ligne
  • Vous pouvez combiner des plages en les plaçant simplement les unes à côté des autres. Par exemple : « [a-cq-z] » correspondra à toutes les lettres de a à c et de q à z.

On peut combiner les classes de caractères, par exemple pour matcher des lettres en minuscules et chiffres :

[a-z][0-9]

Pour inclure un metacaractère en tant que littéral, placez-le n’importe où, sauf juste après le crochet ouvrant. [x^] correspond à un x ou un caret.

  • [a-z-] : correspond à toutes les lettres en minuscule et le caractère –
  • [a-z\-] : correspond à toutes les lettres en minuscule et le caractère \ et –

Supposons maintenant que vous vouliez capturer toutes les occurrences séparément. Pour cette opération, vous devrez utiliser une structure de motif comme celle-ci : .?([motif]).?
Par exemple pour extraire toutes les balises d’ouvertures HTML, vous devez utiliser le motif <.?([a-z]+).?>.

Quantificateurs et répétitions

Les quantificateurs permettent d’indiquer le nombre de fois qu’une occurrence revient et donc sa répétition.
Ils peuvent prendre une classe de caractères, un littéral ou un sous-modèle (voir ci-dessous) et le répéter plusieurs fois.

Classes de caractèresDescription
*Zéro ou plusieurs fois
+Une fois ou plusieurs fois
?Zéro ou une fois
{n,m}Au moins « n » fois, et pas plus de « m »
{n}Au moins « n fois »
{,m}Au plus “m-fois”
*?Correspond zéro fois ou plus à l’élément précédent, mais le moins de fois possible.
+?Correspond une ou plusieurs fois à l’élément précédent, mais le moins de fois possible
??Correspond zéro ou une fois à l’élément précédent, mais le moins de fois possible.
Les quantifieurs et répétitions dans les expressions régulières

Par exemple c[a]{2,3}t correspond à caat ou caaat
Pour un motif pour une répétition de chiffres, par exemple, 1 à 9 fois :

[0-9]{1,9}

Un nombre illimité :

[0-9]+

Pour extraire une adresse IP, on peut utiliser ce motif : ([0-9]{1,3}.\){3}[0-9]{1,3}
Cela signifie 1 à 3 chiffres suivi d’un . que l’on répète 3 fois et à nouveau 1 à 3 chiffres.

tail -20 /var/log/nginx/access.log|egrep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"

Ou encore pour extraire une date au format dd/mm/yyyy :

echo "Je suis né le 12/11/1977 à Paris" | egrep -Eo "([0-9]{1,2}\/){2}[0-9]{4}"

Séquences de négation

La négation est effectuée en plaçant le symbole ^ à l’intérieur d’une classe de caractères.
Par exemple, [^aeiou] correspond à tous les caractères sauf les voyelles. Simultanément, [^a-Z] correspond à tout caractère qui n’est pas une lettre.

Par exemple, les deux [-x] et [x-] correspondent à un x ou un trait d’union. [^-x] et [^x-] correspondent à tout caractère qui n’est pas un x ou un tiret.

Vous pouvez nier des mots spécifiques avec un regard négatif autour de vous. Par exemple, ^(?!.chat).$ annulera le mot chat.

Les anticipations

Les anticipations et les anticipations sont des règles qui vous permettent de spécifier les éléments suivants et précédents de vos modèles.
Ils peuvent être positives (suivre ou précéder) ou négatives (ne pas suivre ni précéder).

  • Anticipation négative : c(?!d) c non suivi de d.
  • Anticipation positive : c(?=d) c suivi de d.
  • Lookbehind négatif : (?<!c)d c non précédé de d.
  • Rétrospective positive : (?<=c)d c précédé de d.

Imbrications “Ou”

En regex, on peut aussi imbriquer des classes de caractères pour obtenir l’opérateur OR.
La syntaxe est : (A|B|C|D)

Par exemple :

Le chat est un animal
La vache est un animal
Le chien est un animal

L’expression régulière vache|cha) fait correspondre les deux premières lignes.

Séquences spéciales

Les séquences spéciales est une autre syntaxe de classe de caractère qui débutent par \ suivi d’une lettre.
Vous pouvez les combiner avec les caractères littéraux pour créer des motifs plus complexes.

Classe de caractèresDescription
\<début du mot
\>fin du mot
\bfrontière entre mot et non-mot
\Bl’inverse de \b
\dcorrespond à n’importe quel caractère numérique. Par exemple : “\d\d\d” correspondra à “123”, “345”, etc
\w correspond à n’importe quel caractère “mot”Par exemple, “N\w\w\w” correspondra à “News”, “Norm”, “Nate”, etc
\s correspond à un caractère d’espacement
\Wcorrespond à tout caractère autre qu’un mot
\Dcorrespond à tout caractère non numérique
\Scorrespond à tout caractère autre qu’un espace
\H correspond à tout caractère d’espacement non horizontal
\V correspondra à tout caractère d’espacement non vertical
\p{xx}Un caractère avec la propriété xx
\P{xx}Un caractère sans la propriété xx
\XSéquence unicode étendue
Les séquences spéciales

Pour les utiliser avec grep, il faut passer en PCRE avec l’option -P et l’encadré entre crochets :

cat /tmp/test|grep -P '[\d]+'
Séquences spéciales en regex avec grep

Catégories BRE (POSIX)

Avec la syntaxe de base (BRE), ces caractères n’ont pas de signification particulière à moins qu’ils ne soient préfixés par une barre oblique inverse (‘\’); Alors qu’avec la syntaxe étendue (ERE), elle est inversée : ces caractères sont spéciaux à moins qu’ils ne soient préfixés par une barre oblique inverse (‘\’).

BRE prend en charge les expressions entre crochets POSIX, qui sont similaires aux classes de caractères dans d’autres saveurs de regex, avec quelques fonctionnalités spéciales.

Classes de caractèresDescription
[:ascii:]Caractères ASCII (similaire à [\x00-\x7F])
[:alnum:]alphanumérique (similaire à [A-Za-z0-9])
[:alpha:]caractère alphabétique (similaire à [A-Za-z])
[:blank:]espace ou tabulation
[:space:]caractère d’espacement
[:digit:]digit numérique (similaire à [0-9])
[:lower:]lettres minuscules (similaires à [a-z])
[:punct:]caractères imprimables, à l’exclusion des espaces et des caractères alphanumériques.
[:upper:]lettre majuscule (similaire à [A-Z])
Les classes de caractères BRE

Les sous-modèles

Les sous-modèles permettent de capturer différentes parties de vos correspondances et de les stocker dans des variables numérotées. Ils sont extrêmement utiles lorsque vous les utilisez avec des commandes de remplacement.
Un sous-modèle est créé en enfermant simplement n’importe quelle partie de votre modèle principal entre ( ).

Le c(hat) (a) miaulé
\1 = hat
\2 = a

sed peut utiliser les sous-modèles.
Par exemple pour extraire une URL complète :

echo "Je suis une URL https://www.malekal.com/comment-installer-windows-10-cle-usb/ du site malekal.com"|sed -nre 's/(.*)(https?:\/\/[a-z0-9./-]+\/)(.*)/\2/p'

Ou encore pour extraire le domaine malekal.com d’une URL en regex :

echo "Je suis une URL https://www.malekal.com/comment-installer-windows-10-cle-usb/ du site malekal.com"|sed -nre 's/(.*)(https?:\/\/)(www\.)?([a-z0-9./-]+\.[a-z]{1,3})(.*)/\4/p'