Aide-mémoire des motifs Regex : Expressions courantes expliquées
· 12 min de lecture
Table des matières
- Bases des Regex
- Classes de caractères et quantificateurs
- Motifs Regex courants
- Ancres, groupes et assertions avant
- Regex en JavaScript
- Regex en Python
- Techniques Regex avancées
- Conseils de performance et bonnes pratiques
- Débogage et test des Regex
- Pièges courants à éviter
- Questions fréquemment posées
- Articles connexes
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 :
*— Zéro ou plusieurs fois (gourmand)+— Une ou plusieurs fois (gourmand)?— Zéro ou une fois (optionnel){3}— Exactement 3 fois{3,}— 3 fois ou plus{3,6}— Entre 3 et 6 fois*?— Zéro ou plusieurs fois (paresseux/non-gourmand)+?— Une ou plusieurs fois (paresseux/non-gourmand)??— Zéro ou une fois (paresseux)
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>" :
- Gourmand :
<div>.*</div>correspond à la chaîne entière du premier<div>au dernier</div> - Paresseux :
<div>.*?</div>correspond à chaque paire<div>...</div>séparément
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 :
- 555-123-4567
- (555) 123-4567
- +1 555 123 4567
- 5551234567
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 :
^— Début de chaîne (ou ligne en mode multiligne)$— Fin de chaîne (ou ligne en mode multiligne)\b— Limite de mot (entre \w et \W)\B— Non-limite de mot\A— Début de chaîne (toujours, même en mode multiligne)\Z— Fin de chaîne (toujours, même en mode multiligne)
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 :
(?=...)— Assertion avant positive (doit être suivi par)(?!...)— Assertion avant négative (ne doit pas être suivi par)
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 :
(?<=...)— Assertion arrière positive (doit être précédé par)(?<!...)— Assertion arrière négative (ne doit pas être précédé par)
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 :