Caractères et échappements
Détails →| Syntaxe | Signification · exemple |
|---|---|
| abc | les caractères a, b, c dans l'ordre |
| . | n'importe quel caractère sauf un saut de ligne |
| \. \* \\ | un métacaractère pris littéralement |
| \t \n \r | tabulation, saut de ligne, retour chariot |
Classes et raccourcis
Détails →| Syntaxe | Signification · exemple |
|---|---|
| [abc] | un caractère parmi a, b ou c |
| [^abc] | n'importe quel caractère sauf a, b ou c |
| [a-z] | une plage : n'importe quelle minuscule |
| \d \D | un chiffre / un non-chiffre |
| \w \W | un caractère de mot [A-Za-z0-9_] / un autre caractère |
| \s \S | un caractère d'espacement / tout le reste |
| \p{L} | une lettre de n'importe quelle écriture (avec le marqueur u) |
Ancres
Détails →| Syntaxe | Signification · exemple |
|---|---|
| ^ | début du texte (d'une ligne avec m) |
| $ | fin du texte (d'une ligne avec m) |
| \b | une limite de mot |
| \B | pas une limite de mot |
Quantificateurs
Détails →| Syntaxe | Signification · exemple |
|---|---|
| * | zéro ou plus |
| + | un ou plus |
| ? | facultatif : zéro ou un |
| {3} | exactement 3 |
| {2,5} | entre 2 et 5 |
| {2,} | 2 ou plus |
| *? +? ?? | paresseux : le moins possible |
Groupes et références arrière
Détails →| Syntaxe | Signification · exemple |
|---|---|
| (abc) | un groupe de capture |
| (?:abc) | un groupe qui ne capture pas |
| (?<name>abc) | un groupe de capture nommé |
| \1 | le texte capturé par le groupe 1 |
| \k<name> | le texte capturé par un groupe nommé |
| a|b | a ou b |
Lookaround
Détails →| Syntaxe | Signification · exemple |
|---|---|
| (?=abc) | suivi de abc (lookahead) |
| (?!abc) | non suivi de abc |
| (?<=abc) | précédé de abc (lookbehind) |
| (?<!abc) | non précédé de abc |
Marqueurs
Détails →| Syntaxe | Signification · exemple |
|---|---|
| i | ignorer la casse |
| g | global : toutes les correspondances, pas seulement la première |
| m | multiligne : ^ et $ à chaque ligne |
| s | dotall : . correspond aussi aux sauts de ligne |
| u | unicode : \p{…} et \u{…} |
| y | sticky : correspond seulement à lastIndex |
Règles et exemples
01 Comment fonctionne une regex
Une expression régulière (regex) est un tout petit langage de motifs pour décrire du texte. Le moteur parcourt votre motif et le texte ensemble, de gauche à droite, en essayant d'aligner chaque partie du motif sur des caractères de la chaîne. S'il y parvient, la chaîne correspond.
Deux questions couvrent presque tout ce que vous ferez :
chaque caractère
Un motif comme cat signifie « un c, puis un a, puis un t, côte à côte ».
combien de fois
Les quantificateurs comme + et * indiquent combien de fois l'élément précédent peut se répéter.
Par défaut, une regex correspond si le motif se trouve n'importe où dans la chaîne : il n'a pas à couvrir tout le texte, sauf si vous l'ancrez.
cata cat satcategorydogDans le jeu (JavaScript)
02 Caractères littéraux
La plupart des caractères correspondent à eux-mêmes. Lettres, chiffres et espaces sont tous des littéraux : regex correspond au texte « regex », 42 correspond à « 42 ». Par défaut, la casse compte : Cat ne correspond donc pas à « cat » (le marqueur i change cela).
codeCODEdecodecoderEntraînementAcadémie : Les bases de la chasse
03 Échapper les métacaractères
Les métacaractères sont la douzaine de caractères qui ont un sens spécial en regex :
. ^ $ * + ? ( ) [ ] { } | \\ /
Pour en trouver un littéralement, placez une barre oblique inverse devant. \. correspond à un vrai point, \+ à un vrai plus, \\ à une vraie barre oblique inverse. Dans une classe de caractères, la plupart perdent leur pouvoir et n'ont pas besoin d'être échappés.
3.143x143,14EntraînementAcadémie : Les bases de la chasse · Jouer : Chasses sur l'échappement
04 Le point ( . )
Le point . correspond à n'importe quel caractère sauf un saut de ligne (à moins que le marqueur s / dotall soit actif). C'est l'élément le plus surutilisé des regex : quand vous voulez dire « n'importe quelle lettre » ou « n'importe quel chiffre », une classe est plus sûre.
catcotc4tctcaatIci, c.t exige exactement un caractère entre le c et le t : « ct » (zéro) et « caat » (deux) échouent tous les deux.
EntraînementAcadémie : Les bases de la chasse
05 Classes de caractères [ ]
Les crochets définissent un ensemble : ils correspondent à exactement un des caractères qu'ils contiennent. [aeiou] correspond à une voyelle. Un tiret définit une plage : [a-z], [0-9], [A-Fa-f0-9] (un chiffre hexadécimal). Commencez par ^ pour inverser : [^0-9] signifie « n'importe quel caractère qui n'est pas un chiffre ».
| Syntaxe | Signification |
|---|---|
| [abc] | a, b ou c |
| [a-z] | n'importe quelle lettre minuscule |
| [0-9a-fA-F] | un chiffre hexadécimal |
| [^aeiou] | tout sauf une voyelle minuscule |
| [.\-] | un point ou un tiret littéral (dans une classe, la plupart des métacaractères sont littéraux) |
CFHc7Pièges
[-a], [a-]). Pour inclure ], échappez-le ([\]a]) : en JavaScript, [] est une classe vide, donc []a] ne fonctionne pas. ^ n'inverse que s'il est le premier caractère.EntraînementAcadémie : Classes de caractères · Pack : Châteaux de caractères · Jouer : Chasses sur les classes de caractères
06 Raccourcis de classe
Les raccourcis de classe remplacent par une seule lettre des ensembles courants, comme \d pour n’importe quel chiffre. La majuscule est la négation de la minuscule correspondante.
| Syntaxe | Signification |
|---|---|
| \d \D | un chiffre [0-9] / un non-chiffre |
| \w \W | un caractère de mot [A-Za-z0-9_] / un autre caractère |
| \s \S | un caractère d'espacement (espace, tabulation, saut de ligne…) / tout le reste |
| \t \n \r | tabulation, saut de ligne, retour chariot |
order 66no digits here2026a1b2Dans le jeu (JavaScript)
\d et \w ne couvrent que l'ASCII, même avec le marqueur u ; utilisez \p{L} ou \p{N} pour les autres écritures. \s couvre déjà les espaces Unicode. Au golf, ils sont bien plus courts qu'une classe écrite en entier.EntraînementAcadémie : Classes de caractères
07 Ancres et limites
Les ancres correspondent à une position, pas à un caractère : leur largeur est nulle.
| Syntaxe | Signification |
|---|---|
| ^ | début de la chaîne (ou de la ligne, avec le marqueur m) |
| $ | fin de la chaîne (ou de la ligne, avec le marqueur m) |
| \b | une limite de mot : la frontière entre un \w et un non-\w |
| \B | une position qui n'est pas une limite de mot |
Entourez un motif de ^…$ pour l'obliger à correspondre à la chaîne entière. \bcat\b correspond au mot entier « cat », mais pas à « category » ni à « scatter ».
cata cat satcategorybobcatconcatenateEntraînementAcadémie : Ancres et limites · Pack : Levez l'ancre · Jouer : Chasses sur les ancres
08 Quantificateurs
Un quantificateur indique combien de fois l'élément précédent peut se répéter.
| Syntaxe | Signification |
|---|---|
| * | zéro ou plus |
| + | un ou plus |
| ? | zéro ou un (facultatif) |
| {3} | exactement 3 |
| {2,5} | entre 2 et 5 |
| {2,} | 2 ou plus |
Il s'applique à ce qui le précède immédiatement : un caractère, une classe ou un groupe. colou?r rend le u facultatif (correspond à « color » et à « colour ») ; (ab)+ répète la paire.
aaaaaaaaaaaaEntraînementAcadémie : Quantificateurs · Pack : Carrière des quantificateurs · Jouer : Chasses sur les quantificateurs
09 Gourmand, paresseux et possessif
Par défaut, les quantificateurs sont gourmands : ils prennent le plus possible, puis rendent des caractères si la suite du motif en a besoin. Ajoutez ? pour en rendre un paresseux : il prend le moins possible.
Exemple classique : sur <a><b>, le gourmand <.*> prend tout, alors que le paresseux <.*?> s'arrête au premier >.
<a><b><one>two<three>Possessif et atomique (absents de JavaScript)
a*+) et des groupes atomiques ((?>…)) qui ne rendent jamais de caractères, une protection contre le backtracking catastrophique. JavaScript n'a ni l'un ni l'autre ; émulez l'atomique avec un lookahead et une référence arrière.EntraînementAcadémie : Quantificateurs
10 Alternance et regroupement
| signifie « ou » et a la priorité la plus basse : il découpe tout le motif en alternatives, sauf si vous le délimitez avec des parenthèses. cat|dog correspond à l'un ou l'autre mot ; gr(a|e)y correspond à « gray » ou « grey », alors que gra|ey voudrait dire « gra » ou « ey ».
graygreygroyEntraînementAcadémie : Groupes et références arrière · Jouer : Chasses sur l'alternance
11 Groupes : capturer et nommer
Les parenthèses ont deux rôles : elles regroupent des éléments pour qu'un quantificateur ou | s'applique à tous, et elles capturent ce qui a correspondu pour le réutiliser plus tard.
| Syntaxe | Signification |
|---|---|
| (…) | groupe de capture, numéroté 1, 2, 3… de gauche à droite |
| (?:…) | groupe non capturant : il regroupe sans rien mémoriser |
| (?<name>…) | groupe de capture nommé |
Utilisez (?:…) quand vous avez seulement besoin de regrouper (c'est plus rapide et vos numéros de groupes restent en ordre), et des noms quand un motif a plusieurs captures qui méritent une étiquette.
abababababababaEntraînementAcadémie : Groupes et références arrière · Pack : Motifs retors · Jouer : Chasses sur les groupes
12 Références arrière
Une référence arrière correspond au même texte qu'un groupe a déjà capturé. \1 renvoie au groupe 1, \2 au groupe 2, \k<name> à un groupe nommé. C'est ainsi que vous exigez une répétition :
| Syntaxe | Signification |
|---|---|
| (.)\1 | n'importe quel caractère suivi de lui-même : une lettre doublée |
| (.)(.)\2\1 | un palindrome de 4 caractères (par ex. « abba ») |
| (.).*\1 | le même caractère réapparaît plus loin |
booktreecatsuccessRéférence arrière ou classe
(.)\1 exige deux fois le même caractère, ce qui n'est pas la même chose que [a-z][a-z] (deux lettres quelconques). Les références arrière permettent aux regex de vérifier « la même chose, encore une fois », ce qu'une simple classe ne sait pas exprimer.EntraînementAcadémie : Groupes et références arrière
13 Lookahead et lookbehind
Un lookaround vérifie que quelque chose apparaît (ou non) à côté de la position courante sans consommer de caractères : c'est une condition de largeur nulle.
| Syntaxe | Signification |
|---|---|
| (?=…) | lookahead positif : suivi de … |
| (?!…) | lookahead négatif : non suivi de … |
| (?<=…) | lookbehind positif : précédé de … |
| (?<!…) | lookbehind négatif : non précédé de … |
Une règle de mot de passe comme « contient un chiffre et une lettre » empile des lookaheads au début : ^(?=.*\d)(?=.*[a-z]).+$. Chaque (?=…) vérifie toute la chaîne depuis la position 0, puis la correspondance continue. Dans la plupart des moteurs, le lookbehind exige une largeur fixe (ou bornée).
16px24 px16ptpxDans le jeu (JavaScript)
EntraînementAcadémie : Lookarounds · Jouer : Chasses sur les lookarounds
14 Marqueurs
Les marqueurs sont des lettres qui modifient le comportement de tout le motif, comme i pour ignorer la casse. Dans le code, ils se placent après la barre oblique fermante (/cat/gi).
| Syntaxe | Signification |
|---|---|
| i | ignorer la casse |
| g | global : trouver toutes les correspondances, pas seulement la première |
| m | multiligne : ^ et $ correspondent à chaque saut de ligne |
| s | dotall : . correspond aussi aux sauts de ligne |
| u | mode unicode (active \u{…} et \p{…}) |
| y | sticky : correspond seulement à lastIndex |
| x | étendu/verbeux : ignore les espaces et autorise les commentaires (PCRE/Python, pas JS) |
Cat caught a CATcategory15 Unicode et propriétés
Avec le marqueur u, vous pouvez chercher par propriété Unicode : \p{L} est n'importe quelle lettre de n'importe quelle écriture, \p{N} n'importe quel nombre, \p{Emoji} un emoji, et \P{…} inverse. \u{1F600} correspond à un point de code par sa valeur hexadécimale.
Sans u, une regex travaille sur des unités de code UTF-16 : un emoji ou un autre caractère astral compte pour deux « caractères », ce qui n'est généralement pas ce que vous voulez. Les échappements de propriétés sont la bonne façon de traiter du texte réel.
Prise en charge par les moteurs
u), en PCRE, en Python (via le module regex), en Java et ailleurs, mais les noms exacts des propriétés diffèrent. Pour la portabilité, tenez-vous-en aux plus courantes (L, N, P, noms d'écritures).16 Motifs courants
Voici des motifs courts et réutilisables pour les formats du quotidien : entiers, décimaux, e-mails, couleurs hexadécimales et dates ISO. Considérez les regex de « validation » comme des approximations : les vraies règles des e-mails et des URL sont bien plus touffues qu'une seule ligne.
| Syntaxe | Signification |
|---|---|
| ^\d+$ | un entier positif ou nul, seul dans la chaîne |
| -?\d+(\.\d+)? | un nombre décimal avec signe facultatif |
| ^[\w.+-]+@[\w-]+\.[\w.-]+$ | la forme approximative d'un e-mail |
| ^#?[0-9a-fA-F]{6}$ | une couleur hexadécimale à 6 chiffres |
| ^\d{4}-\d{2}-\d{2}$ | une date ISO (AAAA-MM-JJ) |
42-3.143.x9EntraînementAcadémie : Validateurs du monde réel · Jouer : Chasses mixtes
17 Astuces pour des motifs plus courts
Le golf, c'est l'art du motif le plus court qui attrape toutes les cibles et épargne tous les innocents. Le plateau vérifie seulement si le motif correspond quelque part : vous avez donc rarement besoin d'ancres, ni de décrire le mot entier.
- Trouvez le plus petit trait distinctif. Si toutes les cibles contiennent
qet qu'aucun innocent n'en contient, la réponse est simplementq. - Préférez une classe à l'alternance :
[cb]atbatcat|bat. - Les raccourcis sont courts :
\dplutôt que[0-9],\wplutôt que[A-Za-z0-9_]. - Laissez tomber les ancres, sauf si un innocent les impose. N'ajoutez
^ou$que pour exclure un mot presque identique. - Rendez les différences facultatives avec
?au lieu de créer des branches. - Pensez à une référence arrière quand les cibles partagent une répétition que les innocents n'ont pas.
Essayez de raccourcir ce motif. cat et bat sont des cibles, « rat » est à épargner :
catbatratmatEnvie de vous mesurer aux autres ? La chasse du jour, les packs d'entraînement et le bac à sable sont là pour mettre tout ça en pratique.
EntraînementAcadémie : Techniques de golf
18 Différences entre moteurs
Les variantes de regex sont les dialectes des différents moteurs : ils ne prennent pas tous en charge les mêmes fonctionnalités. Les grandes familles sont JavaScript, PCRE (PHP, et proche de Perl), Python (re / regex) et Java.
| Syntaxe | Signification |
|---|---|
| Lookbehind | JS (ES2018+), PCRE, Python, Java : largeur fixe dans la plupart ; PCRE/Python en acceptent davantage |
| Possessif / atomique | PCRE, Java, Python regex, pas JavaScript |
Récursion (?R) | PCRE et Python regex seulement : ni JS, ni Python re |
| Groupe nommé | (?<n>) en JS/PCRE/.NET ; (?P<n>) en Python classique |
| x / marqueur verbeux | PCRE, Python, Java, pas JavaScript |
Dans le jeu (JavaScript)
19 Performances et backtracking
La plupart des regex sont rapides, mais des quantificateurs imbriqués sur les mêmes caractères peuvent exploser. (a+)+$, face à une longue suite de « a » suivie d'un « ! », force le moteur à essayer un nombre exponentiel de découpages : c'est le backtracking catastrophique (un retour arrière qui s'emballe).
- Évitez un quantificateur dans un quantificateur qui peut correspondre à la même chose (
(a+)+,(.*)*). - Rendez les parties internes mutuellement exclusives, pour qu'il n'y ait qu'une seule façon de correspondre.
- Ancrez avec
^/$et préférez des classes précises à.pour réduire l'espace de recherche. - Dans les moteurs qui les proposent, les quantificateurs possessifs et les groupes atomiques suppriment complètement le backtracking.