Les expressions régulières comptent parmi les outils les plus puissants et les plus décriés de la programmation : puissantes parce qu’elles condensent une logique de recherche complexe en quelques caractères, décriées parce que ces caractères sont réputés illisibles et sujets aux erreurs. Leur maîtrise est utile dans tous les langages et presque tous les métiers techniques : rechercher et remplacer dans un éditeur, valider des formulaires, analyser des journaux, extraire des données, définir des règles de routage ou manipuler du texte en ligne de commande avec grep et sed. Les sections suivantes présentent la syntaxe de base à connaître, les motifs courants dans le travail quotidien et les bonnes pratiques de test qui distinguent les expressions fiables des expressions risquées.
La syntaxe de base à connaître
La syntaxe des expressions régulières peut sembler intimidante, mais ses éléments de base sont en nombre limité et valent la peine d’être mémorisés. Les classes de caractères en sont le fondement : `\d` correspond à un chiffre, `\w` à un caractère de mot (lettre, chiffre ou tiret bas), et `\s` à un espace blanc. Leurs variantes majuscules (`\D`, `\W`, `\S`) correspondent à l’inverse. Les crochets définissent des classes personnalisées : `[abc]` correspond à l’un de ces trois caractères, `[a-z]` à une lettre minuscule et `[^0-9]` à tout caractère sauf un chiffre. Les quantificateurs indiquent le nombre de répétitions : `*` signifie zéro ou plusieurs, `+` une ou plusieurs, `?` zéro ou une (facultatif), `{3}` exactement 3, `{3,5}` de 3 à 5 et `{3,}` au moins 3. Par défaut, les quantificateurs sont avides et prennent autant de caractères que possible ; ajouter `?` les rend paresseux (`*?`, `+?`). Les ancres correspondent à des positions et non à des caractères : `^` marque le début d’une chaîne (ou d’une ligne avec l’option `m`), `$` sa fin et `\b` une limite de mot. Les parenthèses `(...)` regroupent les opérateurs et capturent le texte correspondant pour le réutiliser. Ces éléments couvrent 90 % des besoins pratiques. La plupart des difficultés disparaissent dès que ce vocabulaire est maîtrisé ; le reste en est une déclinaison.
Motifs courants dans le travail quotidien
Quelques motifs reviennent si souvent dans les projets qu’il est utile de les mémoriser comme modèles. Adresse e-mail (validation permissive) : `/^[\w.+-]+@[\w-]+\.[\w.-]+$/` — suffisant pour filtrer un formulaire, même si l’expression techniquement complète est trop longue pour être écrite à la main. Recherche d’URL : `/https?:\/\/[^\s]+/g` — pratique pour extraire des URL d’un texte, mais elle inclut la ponctuation finale qu’il faudra retirer. Numéros de téléphone américains : `/\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}/` — accepte les parenthèses, tirets et espaces comme séparateurs facultatifs. Adresse IP (IPv4) : `/\b(?:\d{1,3}\.){3}\d{1,3}\b/` — motif simple, mais il accepte aussi `999.999.999.999` (rejeter cette valeur demande une logique de validation plus complexe). Date ISO : `/\d{4}-\d{2}-\d{2}/`, éventuellement avec les groupes nommés `(?
Bonnes pratiques de test : écrire des expressions fiables
La différence entre une expression régulière fiable et une expression qui casse en production tient aux tests. Quatre pratiques font systématiquement la différence. Premièrement, testez les cas positifs (qui doivent correspondre) ET négatifs (qui ne doivent pas correspondre). Il est facile d’écrire un motif qui trouve tous les éléments attendus et de découvrir ensuite qu’il accepte aussi des saisies indésirables. Un jeu de test comportant 10 cas positifs et 10 négatifs révèle la plupart des problèmes. Deuxièmement, testez explicitement les cas limites : chaîne vide, caractère unique, chaîne très longue, caractères Unicode, chaîne contenant uniquement des espaces, retours à la ligne et caractères spéciaux des expressions régulières. Les motifs réagissent parfois de façon surprenante à ces entrées et, en production, elles finiront toutes par apparaître. Troisièmement, méfiez-vous du retour arrière catastrophique. Le motif `(a+)+b` appliqué à `aaaaaaaaaaaaaaaaX` peut prendre un temps exponentiel, car le moteur essaie tous les regroupements possibles des caractères `a`. Soumettez les motifs complexes à des entrées d’apparence malveillante (longues chaînes de caractères répétés) et mesurez leur durée d’exécution. Les attaques ReDoS (déni de service par expression régulière) exploitent précisément cette vulnérabilité dans des motifs mal conçus de validation. Quatrièmement, utilisez un véritable testeur d’expressions régulières — celui-ci ou un module d’éditeur — pendant le développement au lieu d’apprendre par essais et erreurs en production. La mise en surbrillance visuelle en direct permet d’obtenir des motifs fonctionnels 5 à 10 fois plus rapidement que le débogage après des échecs de test.