Les patterns Regex courants que tout dev devrait mettre en favoris

Référence des motifs regex courants avec syntaxe de correspondance mise en évidence sur fond d'éditeur sombre

Les expressions régulières sont des modèles réutilisables qui permettent de repérer des séquences de caractères précises dans un texte - imagine un outil de recherche surpuissant, disponible dans presque tous les langages de programmation. Que tu valides une adresse e-mail, que tu nettoies un numéro de téléphone soumis via un formulaire, ou que tu analyses un fichier de logs, une poignée de regex bien choisies couvrent 90 % de tes besoins. Ce guide rassemble les patterns les plus utiles, explique exactement ce que chacun fait, et te montre comment les adapter.

Rappel rapide de la syntaxe regex

Avant de plonger dans les patterns, voici un aide-mémoire des briques de base que tu rencontreras partout. Même si tu as déjà utilisé des expressions régulières, c'est pratique de tout avoir au même endroit.

Token Signification Exemple de correspondance
. N'importe quel caractère sauf le saut de ligne a.c correspond à abc , a1c
\d N'importe quel chiffre (0-9) \d\d correspond à 42
\w Caractère de mot (lettres, chiffres, underscore) \w+ correspond à hello_world
\s Espace blanc (espace, tabulation, saut de ligne) \s+ correspond à plusieurs espaces
^ / $ Début / fin de chaîne ^\d+$ correspond uniquement à 123
{n,m} Entre n et m répétitions \d{2,4} correspond de 12 à 1234
[abc] Classe de caractères - l'un des caractères a, b, c [aeiou] correspond à n'importe quelle voyelle
(?:...) Groupe non-capturant Regroupe sans stocker de backreference
(?=...) Lookahead positif Vérifie ce qui suit sans le consommer

Le guide des expressions régulières MDN Web Docs est la meilleure référence complète pour la syntaxe regex en JavaScript, et la plupart des patterns ci-dessous s'adaptent directement à Python, PHP, Java et Ruby avec de légères différences de flags.

Validation d'adresses e-mail

L'e-mail est le cas d'usage classique des expressions régulières - et aussi celui que la plupart des développeurs ratent en essayant d'être trop stricts. La spécification RFC 5322 autorise techniquement des adresses comme "very unusual"@example.com , que presque aucune regex ne gère correctement. Pour 99 % de la validation de saisie en conditions réelles, utilise un pattern pragmatique :

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

Ce que fait chaque partie :

  • [a-zA-Z0-9._%+\-]+ - partie locale (avant le @) ; autorise les points, signes plus, tirets, underscores
  • @ - le signe arobase littéral
  • [a-zA-Z0-9.\-]+ - nom de domaine, y compris les sous-domaines
  • \.[a-zA-Z]{2,} - TLD d'au moins 2 caractères (.io, .com, .museum)
Une regex seule ne peut pas confirmer qu'une adresse e-mail existe réellement ou est délivrable. Envoie toujours un e-mail de confirmation pour tout ce qui compte vraiment.

URL et adresses web

La correspondance de patterns d'URL couvre tout, de l'extraction de liens dans du texte brut à la validation d'un champ de site web saisi par l'utilisateur.

https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*)
  • https? - correspond à la fois à http et à https
  • (?:www\.)? - préfixe www optionnel
  • [-a-zA-Z0-9@:%._+~#=]{1,256} - caractères du nom d'hôte, jusqu'à 256 caractères
  • \.[a-zA-Z0-9()]{1,6} - TLD
  • \b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*) - chemin, chaîne de requête et fragment optionnels

Si tu as seulement besoin de valider (et non d'extraire), encadre le pattern avec les ancres ^ et $ .

Numéros de téléphone

Les numéros de téléphone sont notoirement difficiles à gérer, car leur format varie énormément selon les pays et les habitudes des utilisateurs. Deux patterns couvrent la plupart des cas :

Format États-Unis/Canada (NANP)

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

Correspond à : 555-867-5309 , (555) 867 5309 , +1.555.867.5309 , 5558675309

International (format E.164)

^\+[1-9]\d{6,14}$

E.164 est le format utilisé par la plupart des API de téléphonie (Twilio, AWS SNS). Il commence par + suivi d'un indicatif pays, sans espaces ni ponctuation.

Pour aller au-delà de la simple vérification de format - par exemple, vérifier qu'un numéro est bien une ligne mobile valide dans un pays donné - utilise une bibliothèque dédiée comme libphonenumber (la bibliothèque open-source de Google pour les numéros de téléphone, disponible en Java, JavaScript, Python et plus encore).

Dates et heures

La correspondance de patterns de dates est courante dans les parseurs de logs, les validateurs de formulaires et les pipelines de données. Le format ciblé dépend de la source de tes données.

ISO 8601 (YYYY-MM-DD)

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

Format américain (MM/DD/YYYY)

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

Heure sur 24 heures (HH:MM ou HH:MM:SS)

^([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?$

Note que ces patterns valident le format, pas la logique calendaire. Ils accepteront par exemple 2024-02-31 (le 31 février n'existe pas). Pour une validation stricte des dates, utilise la bibliothèque de dates de ton langage après la vérification par regex.

Validation de la robustesse des mots de passe

Les règles de mot de passe exigent généralement un mélange de types de caractères et une longueur minimale. Les lookaheads permettent de gérer ça proprement sans avoir besoin de plusieurs vérifications séparées.

Minimum 8 caractères, au moins une majuscule, une minuscule, un chiffre

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

Robuste : 8+ caractères, majuscule, minuscule, chiffre et caractère spécial

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,}$

Chaque (?=.*[...]) est un lookahead qui parcourt toute la chaîne à la recherche d'au moins un caractère correspondant. Le .{8,} final impose la longueur minimale. Tu peux remplacer {8,} par {12,} pour imposer un minimum de 12 caractères, conformément aux recommandations NIST SP 800-63B .

Adresses IP

IPv4

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

Ce pattern rejette correctement des valeurs comme 999.0.0.1 en faisant correspondre chaque octet explicitement entre 0 et 255.

IPv6 (simplifié)

^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$

Ce pattern gère le format complet à 8 groupes. Pour la notation compressée (par exemple ::1 pour le loopback), le pattern devient nettement plus complexe - à ce stade, utiliser une bibliothèque réseau est plus fiable que la regex.

HTML et balisage

Quelques patterns ciblés sont vraiment utiles ici. Le conseil général "ne parse pas du HTML avec une regex" reste valable pour les documents complets - utilise un vrai parseur DOM comme BeautifulSoup ou DOMParser pour ça. Mais pour des tâches spécifiques et bien délimitées, la regex fait très bien l'affaire.

Supprimer toutes les balises HTML

<[^>]*>

Extraire le contenu d'une balise spécifique (par exemple <title>)

([^<]*)<\/title>

Le groupe capturant 1 contient le texte du titre.

Correspondre aux codes couleur hexadécimaux HTML

#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})\b

Correspond à la fois à la notation abrégée sur 3 chiffres ( #fff ) et à la forme complète sur 6 chiffres ( #ffffff ).

Patterns utilitaires du quotidien

Ces patterns reviennent constamment dans tous types de projets.

Slug (chaîne compatible avec les URL)

^[a-z0-9]+(?:-[a-z0-9]+)*$

Correspond à des chaînes comme my-blog-post-2024 . Pas de majuscules, pas de tirets en début ou fin, pas de tirets doubles.

Numéro de carte bancaire (format de base, sans espaces)

^(?: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})$
  • Commence par 4 - Visa (13 ou 16 chiffres)
  • Commence par 51-55 - Mastercard (16 chiffres)
  • Commence par 34 ou 37 - Amex (15 chiffres)
  • Commence par 6011 ou 65 - Discover (16 chiffres)
Ne stocke jamais de numéros de carte bruts. Ce pattern est uniquement destiné à donner un retour de format côté client. La validation réelle des cartes doit passer par un processeur conforme PCI comme Stripe ou Braintree.

Normalisation des espaces (réduction des espaces multiples)

\s{2,}

Remplace les correspondances par un espace unique pour nettoyer les saisies utilisateur désordonnées ou le texte extrait par scraping.

Chiffres uniquement

^\d+$

Caractères alphanumériques uniquement

^[a-zA-Z0-9]+$

Trouver une ligne contenant un mot (insensible à la casse avec flag)

^.*\bword\b.*$

La limite de mot \b empêche de trouver word à l'intérieur de password .

Extraire des numéros de version (semver)

\bv?(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.]+))?(?:\+([a-zA-Z0-9.]+))?\b

Capture le numéro majeur, mineur, patch, le label de pré-release et les métadonnées de build à partir de chaînes comme v2.14.0-beta.1+build.42 .

Flags et conseils pratiques

Les expressions régulières se comportent différemment selon les flags appliqués. Voici les plus couramment utilisés :

Flag JS Python Effet
Insensible à la casse i re.IGNORECASE Traite les majuscules et minuscules comme équivalentes
Global (trouver tout) g re.findall() Retourne toutes les correspondances, pas seulement la première
Multiligne m re.MULTILINE ^ et $ correspondent aux limites de ligne, pas aux limites de chaîne
Dotall s re.DOTALL . correspond aussi aux sauts de ligne

Quelques bonnes habitudes qui t'éviteront bien des heures de débogage :

  • Teste toujours avec des cas limites - chaîne vide, longueur maximale, caractères Unicode, et chaînes presque valides mais pas tout à fait.
  • Utilise les groupes non-capturants (?:...) quand tu n'as pas besoin du contenu capturé - c'est plus rapide et plus lisible que les groupes capturants.
  • Ancre tes patterns de validation avec ^ et $ pour éviter qu'une sous-chaîne valide au sein d'une chaîne invalide ne passe à travers les mailles.
  • Méfie-toi du backtracking catastrophique - des quantificateurs imbriqués comme (a+)+ peuvent bloquer le moteur regex sur une entrée malformée. Garde tes quantificateurs simples et précis.
  • Utilise un testeur de regex pendant la construction de tes patterns. regex101.com affiche en temps réel le détail des correspondances, explique chaque token, et te permet de basculer entre PCRE, JavaScript, Python et d'autres variantes.
Outils de correspondance de patterns regex et de validation de saisie

Teste et valide tes expressions régulières sans te prendre la tête

Construire des patterns regex fiables pour la validation de saisie est bien plus rapide avec les bons outils. Explore nos utilitaires gratuits pour développeurs pour nettoyer, vérifier et transformer du texte avec des expressions régulières et bien plus encore.

Essaie nos outils gratuits →

Les quantificateurs greedy (comme .* ) cherchent à correspondre au maximum puis reviennent en arrière. Les quantificateurs lazy (comme .*? ) cherchent à correspondre au minimum possible. Par exemple, sur la chaîne bold , le pattern <.*> correspond à toute la chaîne, tandis que <.*?> correspond uniquement à . Utilise les quantificateurs lazy pour extraire du contenu entre délimiteurs.

Globalement oui, mais il y a des différences. Le module re de Python utilise une syntaxe de style PCRE et prend en charge les groupes nommés avec (?P...) . JavaScript utilise une syntaxe de flags légèrement différente et ne supporte pas les lookbehinds sur les anciens moteurs (antérieurs à ES2018). Pour du code multi-langages, reste sur le sous-ensemble commun : classes de caractères, quantificateurs, ancres et groupes de base.

La regex convient parfaitement à la validation de format en production - elle est utilisée dans pratiquement tous les frameworks web. Les risques viennent de patterns mal écrits qui permettent des attaques ReDoS (déni de service par regex) via un backtracking catastrophique. Évite les quantificateurs imbriqués, garde tes patterns précis, et impose toujours une limite de longueur raisonnable sur les entrées avant même que la regex ne s'exécute.

Dans la plupart des moteurs courants, ils sont équivalents pour les entrées ASCII. La différence apparaît avec Unicode : \d dans certains moteurs (comme Python 3 en mode Unicode) correspond aux chiffres d'autres systèmes d'écriture, comme les chiffres arabo-indiens. Si tu veux strictement les chiffres ASCII 0-9, utilise [0-9] pour être explicite. Pour la plupart des validations de formulaires web, cette distinction n'a pas d'importance.

Tu as besoin de deux choses : le flag dotall (pour que . corresponde aux sauts de ligne) et éventuellement le flag multiligne (pour que ^ et $ s'ancrent à chaque ligne plutôt qu'à toute la chaîne). En JavaScript, utilise /pattern/ms . En Python, combine re.DOTALL | re.MULTILINE . Sans le flag dotall, . s'arrête aux sauts de ligne et ton pattern ne couvrira pas plusieurs lignes.