Aide-mémoire des motifs Regex : Expressions courantes expliquées

· 12 min de lecture

Table des matières

Les expressions régulières (regex) sont l'un des outils les plus puissants dans l'arsenal d'un développeur. Que vous validiez des adresses e-mail, analysiez des fichiers journaux, extrayiez des données de texte ou construisiez des opérations complexes de recherche et remplacement, les regex offrent un moyen concis et flexible de travailler avec des motifs de texte.

Ce guide complet couvre tout, de la syntaxe de base aux techniques avancées, avec des exemples pratiques que vous pouvez utiliser immédiatement dans vos projets. Nous explorerons les regex dans différents langages de programmation, partagerons des conseils d'optimisation des performances et vous aiderons à éviter les erreurs courantes qui piègent même les développeurs expérimentés.

Bases des Regex

À la base, une expression régulière est une séquence de caractères qui définit un motif de recherche. Lorsque vous exécutez ce motif sur une chaîne, le moteur regex tente de trouver des correspondances selon les règles que vous avez spécifiées.

Un motif regex se compose de deux types de caractères : les caractères littéraux qui correspondent exactement à eux-mêmes, et les métacaractères qui ont des significations spéciales. Par exemple, le motif /hello/ correspond au texte littéral "hello" n'importe où dans une chaîne. Mais /h.llo/ utilise le métacaractère point pour correspondre à "hello", "hallo", "hxllo", ou toute autre séquence de cinq caractères commençant par "h" et se terminant par "llo".

Métacaractères essentiels

Voici un tableau de référence des métacaractères regex les plus fondamentaux que vous utiliserez quotidiennement :

Métacaractère Description Exemple Correspond à
. N'importe quel caractère unique (sauf nouvelle ligne) c.t cat, cot, c9t, c@t
\d N'importe quel chiffre [0-9] \d{3} 123, 456, 789
\D N'importe quel non-chiffre \D+ abc, XYZ, @#$
\w Caractère de mot [a-zA-Z0-9_] \w+ hello, test_123
\W Caractère non-mot \W @, #, espace, !
\s Espace blanc (espace, tabulation, nouvelle ligne) \s+ Un ou plusieurs espaces
\S Non-espace blanc \S+ N'importe quels caractères visibles
\b Limite de mot \bcat\b "cat" mais pas "category"
^ Début de chaîne/ligne ^Hello Lignes commençant par "Hello"
$ Fin de chaîne/ligne end$ Lignes se terminant par "end"

Conseil pro : Utilisez le Testeur Regex pour expérimenter avec ces motifs en temps réel. Vous pouvez tester avec votre propre texte d'exemple et voir les correspondances surlignées instantanément.

Échapper les caractères spéciaux

Lorsque vous devez correspondre à un métacaractère littéral (comme un point ou un astérisque), vous devez l'échapper avec une barre oblique inverse. Par exemple, \. correspond à un point littéral, et \* correspond à un astérisque littéral.

Les caractères qui nécessitent un échappement incluent : . * + ? ^ $ { } [ ] ( ) | \

Classes de caractères et quantificateurs

Les classes de caractères vous permettent de définir des ensembles de caractères à faire correspondre, tandis que les quantificateurs spécifient combien de fois un motif doit se répéter. Ensemble, ils forment l'épine dorsale de la plupart des motifs regex.

Classes de caractères

Les crochets créent une classe de caractères qui correspond à n'importe quel caractère unique dans les crochets :

Motif Description Exemples de correspondances
[abc] Correspond à a, b ou c a, b, c (un caractère)
[^abc] Correspond à tout sauf a, b ou c d, e, 1, @, etc.
[a-z] Correspond à n'importe quelle lettre minuscule a à z
[A-Z] Correspond à n'importe quelle lettre majuscule A à Z
[0-9] Correspond à n'importe quel chiffre 0 à 9 (identique à \d)
[a-zA-Z] Correspond à n'importe quelle lettre Toutes les lettres, n'importe quelle casse
[a-zA-Z0-9] Correspond à n'importe quel alphanumérique Lettres et chiffres
[a-z&&[^aeiou]] Consonnes uniquement (intersection) b, c, d, f, g, etc.

Quantificateurs

Les quantificateurs spécifient combien de fois l'élément précédent doit correspondre. Ils sont essentiels pour faire correspondre des motifs de longueurs variables :

Correspondance gourmande vs paresseuse

Comprendre la différence entre les quantificateurs gourmands et paresseux est crucial pour écrire des motifs regex efficaces. Par défaut, les quantificateurs sont gourmands — ils correspondent au maximum de texte possible tout en permettant au motif global de correspondre.

Considérez cet exemple avec la chaîne "<div>contenu</div><div>plus</div>" :

La version paresseuse ajoute un ? après le quantificateur, indiquant au moteur regex de correspondre au minimum possible tout en satisfaisant le motif.

Conseil rapide : Lors de l'analyse HTML ou XML, utilisez toujours des quantificateurs paresseux pour éviter de correspondre à travers plusieurs balises. Mieux encore, utilisez une bibliothèque d'analyse appropriée au lieu de regex pour le balisage complexe.

Motifs Regex courants

Voici des motifs regex éprouvés pour les tâches courantes de validation et d'extraction. Ces motifs sont utilisés dans des applications de production dans le monde entier.

Validation d'e-mail

Un motif pratique de validation d'e-mail qui couvre la plupart des cas réels :

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

Ce motif garantit que l'e-mail a une partie locale (avant @), un nom de domaine et un domaine de premier niveau valide. Notez qu'une validation d'e-mail parfaite est impossible avec regex seul — la norme officielle RFC 5322 est incroyablement complexe. Pour une utilisation en production, envisagez d'utiliser une bibliothèque dédiée de validation d'e-mail.

Numéros de téléphone

Numéro de téléphone américain avec code pays optionnel et formatage varié :

^(\+1[-.\s]?)?(\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$

Cela correspond aux formats comme :

URLs

Correspond aux URLs HTTP et HTTPS avec préfixe www optionnel :

^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$

Adresses IP

Validation d'adresse IPv4 :

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

Cela garantit que chaque octet est entre 0 et 255.

Dates

Format de date ISO 8601 (AAAA-MM-JJ) :

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

Format de date américain (MM/JJ/AAAA) :

^(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])\/\d{4}$

Numéros de carte de crédit

Validation de base de carte de crédit (supprime les espaces et tirets) :

^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$

Ce motif valide les cartes Visa, MasterCard, American Express et Discover. Utilisez toujours l'algorithme de Luhn pour la validation réelle.

Mots de passe

Mot de passe fort nécessitant au moins 8 caractères, une majuscule, une minuscule, un chiffre et un caractère spécial :

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$

Cela utilise des assertions avant (couvertes dans la section suivante) pour garantir que toutes les exigences sont satisfaites.

Conseil pro : Testez ces motifs avec le Testeur Regex et enregistrez vos favoris pour un accès rapide. Vous pouvez également utiliser le Formateur de code pour nettoyer les motifs regex dans votre code source.

Ancres, groupes et assertions avant

Ces fonctionnalités avancées vous donnent un contrôle précis sur l'endroit où les correspondances se produisent et comment les motifs sont capturés.

Ancres

Les ancres ne correspondent pas aux caractères — elles correspondent aux positions dans la chaîne :

Exemple : \bcat\b correspond à "cat" comme mot entier mais pas au "cat" dans "category" ou "concatenate".

Groupes de capture

Les parenthèses créent des groupes de capture qui extraient les sous-chaînes correspondantes :

^(\d{3})-(\d{3})-(\d{4})$

Ce motif correspond à un numéro de téléphone et capture séparément l'indicatif régional, le préfixe et le numéro de ligne. Vous pouvez référencer ces captures dans les chaînes de remplacement ou les extraire par programmation.

Groupes non-capturants

Utilisez (?:...) lorsque vous avez besoin de regroupement mais ne voulez pas capturer la correspondance :

(?:https?|ftp)://[^\s]+

Cela correspond aux URLs commençant par http, https ou ftp sans créer de groupe de capture pour le protocole.

Groupes de capture nommés

Les groupes nommés rendent votre regex plus lisible et maintenable :

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

Vous pouvez référencer ceux-ci par nom au lieu de par numéro, rendant votre code plus clair.

Assertions avant positives

Les assertions avant vérifient si un motif existe en avant sans consommer de caractères :

Exemple : \d+(?= dollars) correspond aux nombres suivis de " dollars" mais n'inclut pas " dollars" dans la correspondance.

Assertions arrière

Les assertions arrière vérifient ce qui vient avant la position actuelle :

Exemple : (?<=\$)\d+ correspond aux nombres précédés d'un signe dollar mais n'inclut pas le $ dans la correspondance.

Notez que JavaScript n'a obtenu le support des assertions arrière qu'en ES2018, donc vérifiez la compatibilité si vous supportez des navigateurs plus anciens.

Regex en JavaScript

JavaScript fournit un support regex robuste via l'objet RegExp et les méthodes de chaîne. Voici comment utiliser efficacement les regex dans les applications JavaScript.

Créer des motifs Regex

Vous pouvez créer des motifs regex de deux manières :

// Notation littérale (préférée pour les motifs statiques)
const pattern1 = /\d{3}-\d{3}-\d{4}/;

// Constructeur (utile pour les motifs dynamiques)
const pattern2 = new RegExp('\\d{3}-\\d{3}-\\d{4}');

Notez les doubles barres obliques inverses dans le constructeur — vous devez échapper les barres obliques inverses dans les chaînes.

Drapeaux Regex

JavaScript supporte plusieurs drapeaux qui modifient le comportement des regex :