Les expressions régulières ont la réputation de ressembler à du bruit aléatoire. Un motif comme ^[\w.-]+@[\w-]+\.\w{2,}$ peut donner l'impression qu'un chat a marché sur le clavier. Mais derrière cette syntaxe cryptique se cache une idée remarquablement élégante : un langage concis pour décrire des motifs dans du texte.
Que vous validiez des formulaires, cherchiez dans des fichiers de logs, nettoyiez des données ou fassiez du rechercher-remplacer dans un projet, les regex sont l'un des outils les plus polyvalents du développeur. Et vous n'avez pas besoin de maîtriser chaque fonctionnalité obscure pour en tirer une vraie valeur. Une poignée de briques de base couvre la grande majorité des cas pratiques.
Ce que fait réellement une regex
Une expression régulière (regex ou regexp) est un motif qui décrit un ensemble de chaînes de caractères. Vous le fournissez à un moteur de recherche — dans votre langage de programmation, éditeur de texte ou terminal — et il trouve chaque chaîne correspondante.
Pensez-y comme une recherche améliorée :
- Recherche classique : trouver le mot exact « erreur »
- Recherche regex : trouver tout ce qui ressemble à une adresse IP, une date, un email ou n'importe quelle structure descriptible
Les regex ont été inventées par le mathématicien Stephen Kleene en 1956 et sont entrées en informatique via les éditeurs de texte Unix dans les années 1960. Aujourd'hui, elles sont supportées dans pratiquement tous les langages de programmation et éditeurs de texte.
Les briques de base
Caractères littéraux
La regex la plus simple est du texte brut. Le motif bonjour correspond à la chaîne « bonjour » partout où elle apparaît. Rien de compliqué.
Le point (.) — n'importe quel caractère
Un point correspond à n'importe quel caractère sauf un retour à la ligne.
m.tcorrespond à « mat », « met », « mot », « m3t », et même « m t »
Les classes de caractères ([])
Les crochets définissent un ensemble de caractères autorisés à une position donnée.
[aeiou]— n'importe quelle voyelle[0-9]— n'importe quel chiffre[A-Za-z]— n'importe quelle lettre[^0-9]— tout caractère qui N'EST PAS un chiffre (le^à l'intérieur des crochets signifie « sauf »)
Classes abrégées
| Abréviation | Signification | Équivalent |
|---|---|---|
\d |
N'importe quel chiffre | [0-9] |
\w |
Caractère de mot | [A-Za-z0-9_] |
\s |
Espace blanc | [ \t\n\r] |
\D |
Pas un chiffre | [^0-9] |
\W |
Pas un caractère de mot | [^A-Za-z0-9_] |
\S |
Pas un espace blanc | [^ \t\n\r] |
Les quantificateurs — combien de fois
Les quantificateurs contrôlent le nombre de répétitions de l'élément précédent.
| Symbole | Signification | Exemple | Correspond à |
|---|---|---|---|
* |
Zéro ou plus | ab*c |
« ac », « abc », « abbc » |
+ |
Un ou plus | ab+c |
« abc », « abbc » (pas « ac ») |
? |
Zéro ou un | colou?r |
« color » et « colour » |
{3} |
Exactement 3 | \d{3} |
« 123 », « 456 » |
{2,4} |
Entre 2 et 4 | \d{2,4} |
« 12 », « 123 », « 1234 » |
Les ancres — position
^— début de la chaîne (ou de la ligne, avec le drapeaum)$— fin de la chaîne (ou de la ligne)\b— limite de mot
Le motif ^\d{4}$ correspond à une chaîne qui contient exactement quatre chiffres, comme « 2026 », mais pas « abc2026 » ni « 2026xyz ».
Groupes et alternatives
(abc)— capture « abc » comme un groupea|b— correspond à « a » ou « b »(chat|chien)— correspond à « chat » ou « chien »
Les groupes permettent aussi d'appliquer des quantificateurs à des séquences : (ha)+ correspond à « ha », « haha », « hahaha ».
Motifs pratiques courants
Valider un email (basique)
^[\w.-]+@[\w-]+\.\w{2,}$
Ce motif reconnaît utilisateur@exemple.com, prenom.nom@societe.fr, et rejette les chaînes sans @ ou sans domaine.
Important : Valider parfaitement une adresse email avec une regex est notoirement difficile — la spécification complète RFC 5322 est extrêmement complexe. Pour un système en production, utilisez une regex basique pour le format et vérifiez ensuite l'adresse en envoyant un email de confirmation.
Reconnaître un numéro de téléphone
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Gère des formats comme +33 1 23 45 67 89, 01-23-45-67-89 et (01) 2345 6789.
Reconnaître une URL
https?://[\w.-]+(/[\w./?&=-]*)?
Correspond à https://exemple.com, http://exemple.com/chemin?q=bonjour.
Reconnaître une date (AAAA-MM-JJ)
\d{4}-\d{2}-\d{2}
Correspond à 2026-03-29, 1999-12-31. Attention : cela vérifie uniquement le format, pas la validité — 9999-99-99 serait aussi accepté.
Les drapeaux qui changent le comportement
La plupart des moteurs regex supportent des drapeaux qui modifient l'application du motif :
| Drapeau | Nom | Effet |
|---|---|---|
g |
Global | Trouve toutes les correspondances, pas seulement la première |
i |
Insensible à la casse | bonjour correspond à « Bonjour », « BONJOUR », etc. |
m |
Multiligne | ^ et $ correspondent au début/fin de chaque ligne |
s |
Dotall | . correspond aussi aux retours à la ligne |
En JavaScript, les drapeaux s'ajoutent après le slash : /bonjour/gi. En Python, ils sont passés en argument : re.findall(r"bonjour", texte, re.IGNORECASE).
Quand les regex sont de trop
Les regex sont puissantes, mais pas toujours le bon outil :
- Parser du HTML ou du XML. Utilisez un vrai parseur DOM. Les regex ne gèrent pas correctement les balises imbriquées.
- Parser du JSON. Utilisez
JSON.parse()ou équivalent. Les regex échoueront sur les cas limites. - Validation complexe. Si votre motif fait plusieurs lignes et prend cinq minutes à lire, écrivez plutôt du code de validation procédural.
- Opérations simples sur les chaînes. Si vous avez juste besoin de
startsWith(),includes()ousplit(), les méthodes classiques sont plus claires et plus rapides.
Les pièges courants
- Oublier d'échapper les caractères spéciaux. Le point
.correspond à n'importe quel caractère. Pour un point littéral, utilisez\.. Même chose pour(,),[,],+,*,?,{,},^,$,|et\. - Correspondance gourmande vs paresseuse. Par défaut,
.*est gourmand — il capture le maximum possible. Ajoutez?pour le rendre paresseux :.*?capture le minimum. C'est important quand on extrait du contenu entre des délimiteurs. - Backtracking catastrophique. Des quantificateurs imbriqués comme
(a+)+peuvent amener le moteur à explorer un nombre exponentiel de chemins sur certaines entrées, gelant votre programme. Évitez les répétitions imbriquées sur des motifs qui se chevauchent. - Oublier les ancres. Sans
^et$, votre motif correspond à des sous-chaînes.\d{3}trouve « 123 » dans « abc12345 ». Utilisez^\d{3}$si vous voulez une correspondance exacte.
Pour aller plus loin
La meilleure façon d'apprendre les regex est d'expérimenter. Tapez un motif, collez du texte de test, et observez ce qui s'allume. Ajustez et itérez jusqu'à comprendre comment chaque pièce fonctionne.
- Comment tester des motifs regex — tutoriel interactif avec exemples
- Testeur de regex — collez votre motif et vos données de test, visualisez les correspondances en temps réel