Aller au contenu

Aide-mémoire regex

Les expressions régulières sont assez compactes pour que la syntaxe soit plus facile à consulter qu'à mémoriser. Cette page en contient l'intégralité sur un seul écran — classes, quantificateurs, ancres, groupes, lookaround, échappement et les drapeaux — avec un exemple fonctionnel pour chaque ligne.

La variante est celle de JavaScript, qui est ce qui s'exécute dans votre navigateur et ce qu'utilise le testeur de regex de ce site. L'essentiel est identique en Python, Java, Go et PCRE ; là où les variantes divergent, elles divergent sur les détails — la prise en charge du lookbehind, la syntaxe des groupes nommés, et si \d désigne « chiffre ASCII » ou « n'importe quel chiffre Unicode ».

Deux choses expliquent la plupart des surprises. Les quantificateurs sont gourmands : ils prennent tout ce qu'ils peuvent et ne rendent que lorsque le reste du motif échoue, ce qui explique pourquoi <.+> avale deux balises et <.+?> non. Et l'alternance a la liaison la plus faible de toutes, donc ^a|b$ signifie « commence par a, ou finit par b » — pas ce que la plupart des gens entendent lorsqu'ils l'écrivent.

Classes de caractères

11

Les raccourcis se limitent à l'ASCII, sauf si vous ajoutez le drapeau u et utilisez les échappements de propriété Unicode.

SyntaxeSignificationExemple
.N'importe quel caractère sauf un saut de ligneAjoutez le drapeau s pour qu'il corresponde aussi aux sauts de ligne./a.c/"abc" "abc"
\dUn chiffre, 0–9/\d+/"order 42" "42"
\DTout ce qui n'est pas un chiffre/\D+/"42abc" "abc"
\wLettre, chiffre ou tiret basASCII uniquement — « é » n'est pas \w./\w+/"user_1!" "user_1"
\WTout ce à quoi \w ne correspond pas/\W+/"a++b" "++"
\sTout espace blanc, y compris les tabulations et les sauts de ligne/\s+/"a \t b" " \t "
\STout caractère non blanc/\S+/" hi" "hi"
[abc]L'un quelconque des caractères listés/[aeiou]/"rhythm and" "a"
[^abc]Tout caractère sauf ceux listés/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Une plage de caractères/[a-f]+/"zzabcz" "abc"
\p{L}N'importe quelle lettre Unicode (nécessite le drapeau u)/\p{L}+/"42 café" "café"

Quantificateurs

7

Tous sont gourmands par défaut : ils prennent autant qu'ils le peuvent et ne rendent que si le reste du motif échoue.

SyntaxeSignificationExemple
*Zéro ou plus/ab*/"a" "a"
+Un ou plus/ab+/"abbb" "abbb"
?Zéro ou un — le rend optionnel/colou?r/"color" "color"
{3}Exactement trois/\d{3}/"id 12345" "123"
{2,}Deux ou plus/a{2,}/"aaa" "aaa"
{2,4}Entre deux et quatre/a{2,4}/"aaaaa" "aaaa"
*?Paresseux — prend le moins possibleLe <.+> gourmand engloutirait les deux balises./<.+?>/"<a><b>" "<a>"

Ancres et limites

4

Ils correspondent à une position, pas à un caractère, et ne consomment donc rien.

SyntaxeSignificationExemple
^Début de la chaîne, ou d'une ligne avec le drapeau m/^a/"abc" "a"
$Fin de la chaîne, ou d'une ligne avec le drapeau m/c$/"abc" "c"
\bUne limite de motC'est ce qui empêche « cat » de correspondre à l'intérieur de « concatenate »./\bcat\b/"the cat sat" "cat"
\BPas une limite de mot/\Bcat/"concatenate" "cat"

Groupes et alternance

5
SyntaxeSignificationExemple
(abc)Groupe capturant — mémorisé pour le remplacement/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Groupement sans captureÀ utiliser quand vous n'avez besoin que du groupement ; les numéros de capture restent pertinents./(?:ab)+/"abab" "abab"
(?<name>…)Groupe capturant nommé/(?<year>\d{4})/"in 2026" "2026"
a|bL'un ou l'autre — alternanceL'alternance a la priorité la plus faible : ^a|b$ signifie « ^a » ou « b$ », pas « ^(a|b)$ »./cat|dog/"one dog" "dog"
\1Référence arrière vers le premier groupe/(\w)\1/"letter" "tt"

Lookaround

4

Assertions sur ce qui entoure une position. Elles ne correspondent à rien elles-mêmes, ce qui les rend sûres à combiner.

SyntaxeSignificationExemple
(?=…)Lookahead — suivi de ceci/\d+(?= kg)/"80 kg" "80"
(?!…)Lookahead négatif — non suivi de ceci/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — précédé de ceci/(?<=\$)\d+/"costs $40" "40"
(?<!…)Lookbehind négatif — non précédé de ceci/(?<!\$)\b\d+/"about 40" "40"

Échappement

5

Ces douze caractères sont ceux qui nécessitent une barre oblique inverse pour être pris au sens littéral.

SyntaxeSignificationExemple
\.Un point littéral/\d\.\d/"v2.5" "2.5"
\\Une barre oblique inverse littérale/\\/"C:\\dir" "\\"
\nUn saut de ligne/a\nb/"a\nb" "a\nb"
\tUne tabulation/a\tb/"a\tb" "a\tb"
\uFFFFUn caractère par son point de code/\u00e9/"café" "é"

Drapeaux

6
DrapeauNomSignification
gGlobalTrouve toutes les correspondances, pas seulement la première.
iIgnorer la casseCorrespond quelle que soit la casse, majuscule ou minuscule.
mMultiligneFait correspondre ^ et $ à chaque saut de ligne au lieu de seulement aux extrémités de la chaîne.
sPoint-toutPermet à . de correspondre aussi aux sauts de ligne.
uUnicodeTraite le motif comme des points de code et active les échappements de propriété \p{…}.
yCollantNe correspond qu'exactement à lastIndex, sans jamais chercher plus loin.

FAQ

Quelle est la différence entre les quantificateurs gourmands et paresseux ?
Les quantificateurs gourmands (*, +, {2,}) correspondent à autant que possible et ne rendent des caractères que lorsque le reste du motif ne peut pas correspondre. Ajouter ? les rend paresseux : ils correspondent à aussi peu que possible et n'en prennent davantage que sous la contrainte. Sur « <a><b> », le motif <.+> renvoie toute la chaîne et <.+?> ne renvoie que <a>.
Pourquoi mon mot correspond-il à l'intérieur d'autres mots ?
Parce que rien ne l'a ancré. Encadrez le mot avec \b — /\bcat\b/ correspond à « cat » dans « the cat sat » mais pas à l'intérieur de « concatenate ». \b correspond à une position entre un caractère de mot et un caractère qui n'en est pas un, il ne consomme donc rien.
Que change le drapeau u ?
Il fait opérer le motif sur les points de code plutôt que sur les unités UTF-16, de sorte qu'un seul emoji compte pour un caractère, et il active les échappements de propriété \p{…} tels que \p{L} pour « n'importe quelle lettre ». Sans lui, \w et \d restent limités à l'ASCII, ce qui explique pourquoi « café » ne correspond pas entièrement à /\w+/.
Quand dois-je utiliser un groupe non capturant ?
Chaque fois que vous avez besoin du groupement mais pas du texte capturé — (?:ab)+ au lieu de (ab)+. Les captures coûtent un peu de performance, mais la vraie raison est la numérotation : chaque groupe capturant que vous ajoutez décale les numéros de ceux qui suivent, cassant discrètement les remplacements qui utilisent $1 et $2.
Le lookbehind peut-il être utilisé sans risque ?
Dans les navigateurs actuels et Node, oui — (?<=…) et (?<!…) sont pris en charge par tous les moteurs majeurs depuis 2018. Safari a été le dernier à l'ajouter. Si vous ciblez des environnements d'exécution très anciens, vérifiez d'abord ; il n'existe pas de polyfill pour la syntaxe des regex.