La feuille de triche Regex: modèles, drapeaux et exemples du monde réel
Une feuille de triche pratique d'expressions régulières avec des classes de caractères, des quantificateurs, des ancres, des groupes, des solutions de contournement, des drapeaux et des modèles testés pour les tâches quotidiennes.
· 5 min de lecture
Les expressions régulières sont un langage compact pour décrire le texte. Une seule ligne peut valider l'entrée, extraire des données des journaux ou renommer des centaines de fichiers. La syntaxe est dense, cependant, et de petites erreurs produisent des modèles qui fonctionnent presque. Cette feuille de triche recueille la syntaxe que vous utiliserez quotidiennement, explique les parties qui font trébucher les gens, et se termine par des modèles testés que vous pouvez adapter. Tous les exemples utilisent la syntaxe JavaScript, qui est également très proche de Python, Java, Go et .NET.
Essayez chaque modèle dans un testeur de régex pendant que vous lisez; voir les correspondances surlignées est le moyen le plus rapide de construire une intuition.
Les personnages littéraux et l' évasion
La plupart des personnages se correspondent: cat correspond à "cat". Douze caractères ont une signification spéciale et doivent être évités avec une barre arrière pour correspondre littéralement:
. * + ? ^ $ { } ( ) | [ ] \ /
Donc 3.14 correspond à "3.14" mais aussi "3x14", tandis que 3\.14 correspond seulement à "3.14".
Classes de caractères
| Modèle | Coups de feu |
|---|---|
. |
N'importe quel caractère sauf une nouvelle ligne (sauf si le drapeau s est défini) |
\d |
Un chiffre 09 |
\w |
Un caractère de mot: lettre, chiffre ou soulignement |
\s |
Espace blanc: espace, onglet, nouvelle ligne |
\D, \W, \S |
Le contraire de ce qui précède |
[abc] |
Un des a, b ou c |
[a-z] |
Toute lettre ASCII minuscule |
[^0-9] |
Tout caractère autre qu'un chiffre |
\p{L} |
N'importe quelle lettre dans n'importe quel script (exige le drapeau u) |
Dans les parenthèses carrées, la plupart des caractères spéciaux perdent leur signification. [.] correspond à un point littéral. Un trait d'union est littéral lorsqu'il est placé en premier ou en dernier: [-a-z].
Quantifiants
| Modèle | Signification |
|---|---|
a* |
Zéro ou plus |
a+ |
Un ou plusieurs |
a? |
Zéro ou un (facultatif) |
a{3} |
Exactement trois . |
a{2,5} |
Entre deux et cinq . |
a{2,} |
Deux ou plus |
Les quantificateurs sont avides: ils correspondent autant que possible et reculent ensuite. Ajouter ? les rend paresseux. Compte tenu de <b>bold</b>, le motif <.+> correspond à l'ensemble de la chaîne, tandis que <.+?> correspond uniquement à <b>.
Ancres et limites
^correspond au début de la chaîne, ou de chaque ligne avec le drapeaum.$correspond à la fin de la chaîne, ou de chaque ligne avecm.\bcorrespond à une limite de mots: la position entre un caractère de mot et un caractère non-mot.
\bcat\b correspond à "cat" dans "the cat sat" mais pas dans "concatenate". Les ancres sont essentielles pour la validation: \d{5} trouve cinq chiffres n'importe où dans "abc123456", tandis que ^\d{5}$ exige que l'ensemble de l'entrée soit exactement de cinq chiffres.
Groupes et alternance
- Groupe
(abc)et captures. Le texte capturé est disponible sous forme$1,$2en remplacement. - Les groupes
(?:abc)sans capture, ce qui est plus rapide et maintient la numérotation propre. (?<year>\d{4})est un groupe nommé, accessible sous le nom dematch.groups.year.a|bcorrespond à A ou B. L'alternance a la priorité la plus basse, donc^cat|dog$signifie "commence par le chat" ou "se termine par le chien". Utilisez^(?:cat|dog)$pour faire correspondre exactement un mot.\1est une référence au groupe 1:(\w)\1trouve des lettres doublées comme "ll" dans "bonjour".
Regardez autour de vous .
Les repères affirment que quelque chose est ou n'est pas à côté de la position actuelle sans consommer de caractères.
| Modèle | Signification |
|---|---|
(?=...) |
Perspective positive: suivie de |
(?!...) |
Point de vue négatif: non suivi de |
(?<=...) |
Positive lookbehind: précédé de |
(?<!...) |
Negative lookbehind: n'est pas précédé de |
Exemples: \d+(?=px) correspond au nombre dans "16px" sans "px"; (?<=\$)\d+ correspond au montant après un signe de dollar; ^(?!.*password).*$ correspond aux lignes qui ne contiennent pas "mot de passe".
Les drapeaux
g(global): trouver toutes les correspondances au lieu de s'arrêter au premier.i(ignorer la casse):acorrespond à "A".m(multiline):^et$correspondent aux ruptures de ligne.s(dotAll):.correspond également aux nouvelles lignes.u(unicode): traite les paires de substitution telles que les émojis comme des caractères simples et permet\p{...}.y(collante): correspond uniquement à la position où le dernier match a pris fin.
Modèles pour les tâches quotidiennes
Elles sont plus pratiques qu'exhaustives. La validation réelle doit être combinée à des vérifications côté serveur.
Paramètres électroniques (pragmatiques):
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Capture des fautes de frappe comme un @ manquant ou un domaine; la seule véritable validation est d'envoyer un e-mail de confirmation.
** URL slug:**
^[a-z0-9]+(?:-[a-z0-9]+)*$
** Date ISO (AAAA-MM-DD):**
^(?<year>\d{4})-(?<month>0[1-9]|1[0-2])-(?<day>0[1-9]|[12]\d|3[01])$
Ceci vérifie la forme et les plages, mais pas si le 31 février existe; analysez la date pour confirmer.
** Couleur hex:**
^#(?:[0-9a-fA-F]{3}){1,2}$
** Adresse IPv4:**
^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)$
** Version sémantique:**
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$
Vérification du mot de passe fort (au moins 12 caractères, une minuscule, une majuscule, un chiffre):
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$
** Décapage des espaces:** remplacer ^\s+|\s+$ (avec g) par une chaîne vide.
** Collapse des espaces répétés:** remplacer {2,} par un seul espace.
Extraire des paires de clés=valeurs à partir d'une ligne log:
(\w+)=("[^"]*"|\S+)
** camelCase to snake_case:** remplacer ([a-z0-9])([A-Z]) par $1_$2, puis minuscule le résultat. Pour en savoir plus sur les styles de dénomination, voir camelCase vs snake_case.
Performance et retracement catastrophique
Les moteurs Regex dans JavaScript, Python et Java utilisent le backtracking. Certains modèles forcent le moteur à essayer un nombre exponentiel de combinaisons sur des entrées qui correspondent presque. L'exemple classique est ^(a+)+$ contre "aaaaaaaaaaaaaaaaaaa!". Chaque "a" supplémentaire double le travail, et quelques dizaines de caractères peuvent geler un serveur un vecteur de déni de service connu sous le nom de ReDoS.
Pour l'éviter:
- Ne placez pas les quantificateurs sur les mêmes caractères, comme dans
(a+)+ou(\w*)*. - Rendre les alternatives mutuellement exclusives:
(a|ab)*est risqué; restructurez-le. - Préférer des classes spécifiques à
.*:"[^"]*"est plus sûr et plus rapide que".*?". - Limitez la longueur d'entrée avant de faire correspondre des données non fiables.
Conseils de lisibilité
- Construisez des motifs complexes progressivement et testez chaque pièce.
- Utilisez des groupes nommés pour que le code lise
m.groups.monthplutôt quem[2]. - Commenter des modèles complexes dans le code, ou les construire à partir de chaînes plus petites.
- Si un motif a besoin de plus d'une ligne ou deux, considérez si un petit analyseur serait plus clair.
Résumé
Apprenez les classes de base, les quantificateurs, les ancres, les groupes et les drapeaux et vous pourrez lire la plupart des régexes que vous rencontrerez. Utilisez délibérément des quantificateurs et des ancres paresseux, recherchez des solutions de contournement lorsque vous avez besoin de contexte sans le consommer, surveillez les quantificateurs imbriqués et testez toujours des exemples correspondants et non correspondants avant d'envoyer un motif.
Cette page a été traduite automatiquement depuis l'anglais. Si vous repérez une erreur, dites-le-nous.