Tester une regex en ligne : guide pratique pour déboguer vos expressions régulières

Tester une regex en ligne : guide pratique pour déboguer vos expressions régulières

Testez une regex JavaScript, inspectez les groupes de capture et prévisualisez un remplacement $1 dans le navigateur, avant la mise en production.

26.09.2026
13 min de lecture
Partager cet article:
Regex
Expressions régulières
Validation
tools-dev
Tutoriel

Un motif qui a l'air juste mérite quand même une entrée qui échoue

Une expression régulière est un petit programme. Elle s'écrit vite, se colle depuis un commentaire, et coûte cher quand elle accepte la mauvaise chaîne ou fige l'onglet. Le testeur de regex en ligne exécute le moteur RegExp JavaScript du navigateur sur un motif et un texte collés localement — surlignage à gauche, cartes de correspondance avec groupes à droite, et un aperçu de remplacement en option. Il n'y a pas de choix de dialecte : ce n'est ni PCRE, ni Python, ni le moteur d'une base de données. C'est la même famille que Node, et que le mot-clé pattern d'un JSON Schema évalué par Ajv. La page est sur le hub des utilitaires développeur, à côté de slugify et du convertisseur de casse, pour les tâches qui ne devraient pas être une expression écrite à la main.

Flags JavaScript seulement : g, i, m, s, u, y. Le global (g) est actif par défaut et peut être coupé
Le mode correspondance surligne les hits et liste des cartes avec groupes numérotés ; un groupe nommé apparaît une fois, sous la forme GROUP k (nom)
Le mode remplacement prévisualise les motifs JavaScript $1, $& et $<name>
Six exemples intégrés et un aide-mémoire qui insère le jeton au curseur. Le bouton Exemple charge le cas clé=valeur et l'exécute
Rien n'est envoyé. Cliquez sur Tester pour lancer — modifier le motif, les flags, le mode ou le texte efface le résultat précédent
500 correspondances au plus sont renvoyées. Une rafale de matches vides déclenche un garde-fou. Des quantifieurs imbriqués peuvent quand même figer l'onglet

Où le testeur aide, et où un test unitaire doit prendre le relais

Les bons usages de la page

Un motif que vous allez coller dans du code, une fixture, ou le mot-clé pattern d'un JSON Schema.

Reproduire un bug avec le sujet exact du ticket, y compris la ligne qui ne doit pas matcher
Comparer gourmand et paresseux sur deux mots entre guillemets avant de choisir une classe niée
Vérifier qu'un pattern JSON Schema est valide en JavaScript avant de compiler le schéma dans Ajv
Prévisualiser un remplacement avec $1 sur un échantillon de trois lignes, puis copier le motif dans la revue de code
Charger une puce d'exemple quand il faut un point de départ connu plutôt qu'un champ vide
Ce qui n'a pas sa place dans un bac à sable regex

Certaines tâches ont déjà un outil qui encode les règles. Une expression écrite à la main dérivera.

Slugs d'URL : utilisez slugify (séparateur, casse, longueur) plutôt qu'un remplacement à retoucher par langue
camelCase, snake_case, kebab-case : utilisez le convertisseur de casse. Une regex de frontières de mots casse sur les chiffres et les sigles
E-mail, UUID ou date-time comme règle produit : un format de schéma ou un parseur dédié, pas la puce « Email (approx.) »
Un motif qui doit rester stable : commitez-le à côté des fixtures dans le dépôt. Le testeur ne stocke pas votre motif dans le lien de partage — ce bouton partage la page de l'outil, pas l'expression en cours

Des motifs qui passent un coup d'œil et cassent sur une vraie entrée

Déboguer un extrait PCRE dans une boîte JavaScript

Le testeur compile le champ avec new RegExp. Une construction récursive comme (?R) est invalide ici et affiche l'erreur du moteur. Les barres obliques autour du champ sont l'habillage de l'interface, pas une partie du motif. Coller /(\w+)/gi retire les délimiteurs et fusionne ces flags avec ceux déjà cochés — il ne les remplace pas. Si g était déjà actif, il le reste. Second piège, la barre oblique inverse : le champ est la source de la regex, donc \d signifie « des chiffres ». Coller \\d depuis une chaîne JSON ou Java cherche une barre oblique inverse littérale suivie de d.

Copier un motif réservé à PCRE depuis une réponse de forum et attendre les mêmes correspondances
Saisir les barres obliques autour du motif, qui deviennent alors des caractères littéraux
Croire qu'un collage /motif/flags remplace les flags courants au lieu de les fusionner
Doubler chaque barre oblique inverse parce que le motif vient d'une chaîne dans du code source
Laisser un quantifieur gourmand avaler le reste de la ligne

Sur "one" and "two", le motif ".+" avec g renvoie une seule correspondance : tout l'intervalle, du premier guillemet au dernier. Le moteur prend le plus possible, puis rend des caractères jusqu'à ce que le dernier guillemet convienne. Passer à ".+?" ne veut pas dire « seulement les mots voulus ». Avec g, on obtient deux correspondances, "one" et "two". Paresseux signifie le succès le plus court, pas un filtre sémantique. "[^"]*" est le motif qui ne peut pas franchir un guillemet.

Utiliser .+ alors que le caractère d'arrêt est connu, puis s'étonner qu'une correspondance ait mangé la ligne
Prendre un quantifieur paresseux pour un filtre de sens
Oublier que g trouve chaque succès, y compris le second mot entre guillemets
Ne tester que la chaîne heureuse qui ne contient qu'une paire
Des quantifieurs imbriqués sur un long sujet

Une forme comme (a+)+ face à une longue suite de a qui n'atteint jamais la fin attendue peut exploser en backtracking catastrophique. Le testeur n'a pas de délai côté serveur. Il tourne sur le fil principal de l'onglet, donc la page peut se figer. L'outil plafonne ce qu'il renvoie : la recherche globale s'arrête et affiche un avertissement de troncature, soit parce qu'elle a atteint le plafond souple de 500 correspondances, soit parce qu'un motif de largeur nulle a déclenché le garde-fou (le moteur avance d'un caractère après un match vide pour que g ne tourne pas indéfiniment). Ce garde-fou ne rend pas un quantifieur imbriqué sûr. L'envoi de fichier accepte .txt, .md et .log jusqu'à 32 Mio dans le texte de test, toujours en local — un journal entier plus un motif imbriqué est un bon moyen de bloquer l'onglet.

Déposer un journal de production dans le sujet alors que le motif a encore des quantifieurs imbriqués
Lire l'avertissement de troncature comme « le motif est bon, il y avait juste trop de hits »
Tester \b sur une longue chaîne et prendre des centaines de cartes vides pour des correspondances de contenu
Supposer que le navigateur tuera une expression folle comme le ferait un job de CI
Promouvoir l'exemple e-mail en validateur

La puce « Email (approx.) » est [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,} sur [email protected] x not-an-email [email protected]. Avec g, elle surligne [email protected] et [email protected]. C'est une démo, pas la RFC 5322, et la page le dit. La même honnêteté vaut pour le mode sticky : le flag y ne matche ici qu'au début du texte de test, parce que lastIndex est remis à zéro à chaque exécution. Il ne « reprend pas là où le match précédent s'est arrêté » d'un clic à l'autre. Et les résultats ne se mettent pas à jour pendant la frappe. Changer le motif, les flags, le mode ou le texte efface les cartes jusqu'au prochain clic sur Tester.

Livrer le motif « Email (approx.) » comme validation de formulaire
Attendre que le flag y reprenne après le match précédent
Modifier le motif et lire les cartes qui viennent de disparaître comme une panne du moteur
Couper g et s'étonner qu'une chaîne avec trois dates n'affiche qu'une carte

Ce que chaque flag et chaque mode changent vraiment ici

g, i, m, s, u, y

Six flags, pas d'autres. Le défaut est g seul.

g — global. Chaque correspondance non chevauchante. Désactivé : le premier match seulement. matchAll en JavaScript exige aussi g
i — ignorer la casse. foo contre FOO rate tant que i n'est pas actif
m — multiligne. ^ et $ matchent en bord de ligne. La puce ^\w+: sur « name: Ada » puis « age: 36 » a besoin de g et m pour attraper les deux libellés
s — dotAll. Le point matche les sauts de ligne. Sans s, un motif qui doit traverser une fin de ligne échoue même si le texte paraît continu
u — Unicode. Transforme \p{L} en échappement de propriété qui matche les lettres. Sans u, la même source matche le texte littéral p{L} : elle compile, et elle ne matche pas é
y — sticky, mais lastIndex est remis à zéro à chaque exécution : le match doit commencer à l'index 0 du texte. Sur « ba », le motif a avec y ne matche rien ; sur « ab », il matche le a initial et s'arrête
Cartes de correspondance ou aperçu de remplacement

Le mode correspondance liste les hits. Le mode remplacement montre aussi la chaîne substituée, avec les motifs de remplacement JavaScript.

Correspondance : chaque carte montre l'index, le texte et les groupes. Un match vide (largeur nulle) est libellé (vide), pas omis
Les surlignages ne se chevauchent pas : le premier match gagne, les chevauchements suivants sont sautés dans la chaîne peinte
Remplacement : $1 est le groupe 1, $& est le match entier, $<name> est un groupe nommé. La puce (\w+)=(\d+) avec [$1=$2] sur a=1 b=2 devient [a=1] [b=2]
Le cas plus court de la doc, (\d+) remplacé par [$1] sur x=10, devient x=[10]. La substitution est un aperçu, pas une réécriture de fichier
Groupes numérotés, groupes nommés, et le plafond de 500

Une capture nommée est le même groupe que son numéro. La carte ne l'affiche qu'une fois.

La puce date (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) sur « shipped 2024-03-15 ok » donne GROUP 1 (year), GROUP 2 (month), GROUP 3 (day) — pas une seconde ligne sans nom
La puce paires (\w+)=(\d+) sur « user=42 role=admin env=prod » donne un seul match, user=42. role=admin n'est pas des chiffres. L'exemple fonctionne comme il est écrit, ce n'est pas un bug
La puce chiffres \d+ sur « order-1042 total=89 » donne 1042 et 89
Au-delà de 500 correspondances, la liste est coupée et un avertissement dit que les résultats ont été tronqués (plafond souple ou garde-fou). L'avertissement invite à resserrer le motif ou le sujet, pas à prendre un balayage partiel pour un balayage complet

Un cas, puis une seule variable à la fois

Motif, flags, texte, Tester

Sur le testeur de regex, rien ne s'exécute pendant la frappe. Les cartes précédentes s'effacent dès que les entrées changent.

1

Écrire la source, pas un littéral

Saisissez \d+, pas /\d+/g. Si vous collez quand même un littéral /motif/flags, le collage ou la perte de focus retire les délimiteurs et fusionne les flags. Un motif vide est une erreur. Un motif invalide affiche le message JavaScript.

2

Ne basculer que le flag que vous voulez tester

g est actif par défaut. Coupez-le pour confirmer que vous vouliez vraiment un seul match. Ajoutez m avant de faire confiance à ^ sur une seconde ligne. Ajoutez u avant \p{…} — sans lui, \p{L} matche les caractères littéraux p{L}, pas les lettres. Laissez y coupé, sauf pour vérifier un match qui doit commencer à l'index 0.

3

Appuyez sur Tester et lisez la carte, pas seulement le surlignage

Le surlignage montre où se trouve le hit. La carte montre l'index et chaque groupe. Cliquez une carte pour mettre ce hit en évidence. En mode remplacement, lisez la chaîne substituée sous les cartes avant de copier le motif dans le code.

Exemples, jetons, et un fichier local

Les puces sont des fixtures, pas une bibliothèque de validateurs de production.

Exemples : paires clé=valeur, chiffres, date nommée, Email (approx.), Multiligne ^, Replace groupes. En choisir un remplit les champs et lance tout de suite
Le bouton Exemple fait la même chose avec la fixture des paires : (\w+)=(\d+) sur user=42 role=admin env=prod
L'aide-mémoire insère \d, \w, \s, ., [], ^, $, \b, +, *, ? et () au curseur. Crochets et parenthèses placent le curseur à l'intérieur
L'envoi lit un fichier .txt, .md ou .log jusqu'à 32 Mio dans le texte de test, dans le navigateur. Préférez un court extrait quand le motif n'est pas clairement linéaire
Effacer remet le motif, le texte, le remplacement et le mode à vide, et les flags à g

Le même moteur dans Node

Collecter les correspondances comme le testeur

Le RegExp de Node est le même langage. matchAll exige le flag g. Sans g, appelez exec une fois.

Exemple de base

const subject = 'user=42 role=admin env=prod' const re = /(\w+)=(\d+)/g const matches = [...subject.matchAll(re)] // longueur 1 — role=admin n'est pas des chiffres // matches[0][0] === 'user=42' // matches[0][1] === 'user' // matches[0][2] === '42'
Prévisualiser un remplacement avant qu'il ne modifie un fichier

Les motifs de remplacement sont ceux que le champ de remplacement accepte. C'est la puce intégrée, pas un langage de template maison.

Exemple de base

const out = 'a=1 b=2'.replace(/(\w+)=(\d+)/g, '[$1=$2]') // [a=1] [b=2] const wrapped = 'x=10'.replace(/(\d+)/g, '[$1]') // x=[10]
regex-tester FastMinify

Pas d'installation, rien n'est envoyé, flags et groupes visibles, aperçu de remplacement inclus. Contrepartie : pas de choix de dialecte, mode sticky seulement à l'index 0, 500 correspondances renvoyées au plus, et un quantifieur imbriqué peut figer l'onglet parce que l'exécution est locale. Gardez la page pour une fixture et une revue de code. Commitez le motif à côté des tests quand il protège une entrée de production. Si l'expression ne servait qu'à tenir lieu d'un slug ou d'un changement de casse, passez à slugify ou au convertisseur de casse plutôt que de la maintenir.

Conclusion

Testez le motif contre une chaîne qui doit échouer, dans le moteur qui l'exécutera. Pour JavaScript, ce moteur est RegExp, celui qu'utilise le testeur de regex — y compris un pattern JSON Schema que vous compilerez ensuite avec Ajv dans le validateur JSON Schema. Ne prenez pas la puce « Email (approx.) » pour un validateur, n'attendez pas que le flag y reprenne au milieu de la chaîne, et ne donnez pas un journal de 32 Mio à un quantifieur imbriqué. Quand la tâche est un slug ou un changement de casse, laissez l'expression et utilisez l'outil dédié sur le hub des utilitaires développeur.

RegExp JavaScript seulement — un extrait PCRE refusé par le testeur échouera aussi dans Node
Appuyez sur Tester après chaque modification ; les cartes ne suivent pas le curseur
Un .+ gourmand entre guillemets est un seul match ; le paresseux est chaque paire la plus courte, pas un filtre de sens
Les groupes nommés n'apparaissent qu'une fois. Plus de 500 hits, c'est une liste tronquée, pas un balayage complet
Le flag y ne matche qu'au début du texte de test dans cet outil
Partager cet article
Partager cet article: