BrowserTools
Publicité
Accueil / Validateurs / Testeur et Débogueur de Regex

Testeur et Débogueur de Regex

Testez des expressions régulières JavaScript en direct avec surlignage des correspondances, groupes de capture et aperçu du remplacement.

Chargement de Testeur et Débogueur de Regex… Si rien ne se passe, activez JavaScript.

Les expressions régulières (regex ou regexp) sont un langage formel permettant de décrire des motifs dans du texte. La théorie remonte au mathématicien Stephen Cole Kleene, qui a formalisé l'algèbre des langages réguliers en 1956, et à Ken Thompson, qui a implémenté les regex dans l'éditeur QED et dans les outils Unix d'origine grep, sed et awk dans les années 1960 et 1970. Les moteurs de regex modernes étendent ce fondement théorique avec des fonctionnalités pratiques comme les anticipations (lookaheads), les références arrière (backreferences) et les groupes de capture nommés, ce qui en fait l'un des outils de traitement de texte les plus puissants disponibles dans n'importe quel langage de programmation.

Exemples

Entrée \b\w+@\w+\.\w+\b on "a@b.com x@y.org"
Sortie 2 matches: a@b.com, x@y.org

Les groupes de capture et les drapeaux (g, i, m) s'affichent en direct à mesure que vous tapez.

Questions fréquentes

Ma saisie est-elle envoyée à un serveur ?
Non. L'expression régulière est évaluée entièrement dans votre navigateur à l'aide du moteur natif RegExp de JavaScript. Votre motif, votre chaîne de test et tout modèle de remplacement ne quittent jamais votre appareil et ne sont jamais transmis sur le réseau.
Quelle variante de regex cet outil utilise-t-il ?
Cet outil utilise le moteur de regex JavaScript (ECMAScript) via le constructeur natif RegExp. Il prend en charge toutes les fonctionnalités standard d'ES2024, y compris les groupes de capture nommés (?<name>...), les assertions arrière lookbehind ((?<=...) et (?<!...)), le drapeau dotAll (s), le drapeau Unicode (u), le drapeau d'indices (d) et le drapeau v récemment ajouté pour la notation d'ensembles Unicode. Il ne prend pas en charge les fonctionnalités propres à PCRE comme les motifs récursifs ou les quantificateurs possessifs.
Quand devrais-je utiliser une regex plutôt que des méthodes de chaîne simples ?
Pour des recherches simples de chaînes fixes, String.prototype.includes() ou indexOf() est plus rapide et plus lisible qu'une regex. Recourez à une regex lorsque vous avez besoin de correspondance de motifs (par exemple, « commence par un chiffre »), d'alternance (correspondre à 'cat' ou 'dog'), de classes de caractères (correspondre à n'importe quelle voyelle), de quantificateurs (correspondre à un ou plusieurs chiffres) ou de groupes de capture pour extraire des sous-correspondances. La regex excelle dans les tâches de validation, d'extraction et de transformation où le motif cible a une structure qui ne peut pas s'exprimer par une seule chaîne littérale.
En quoi la regex JavaScript diffère-t-elle de PCRE (Python, PHP, Perl) ?
La variante de regex de JavaScript est similaire à PCRE mais présente quelques différences notables. JavaScript ne prend pas en charge les groupes atomiques, les quantificateurs possessifs ni les motifs récursifs. L'assertion \K (keep) disponible dans PCRE est absente de JavaScript. Les groupes de capture nommés utilisent la syntaxe (?<name>...) en JavaScript, contre (?P<name>...) en Python. Le drapeau global (g) en JavaScript affecte la propriété à état lastIndex de l'objet RegExp, ce qui peut provoquer des bugs subtils lors de la réutilisation d'un objet regex dans une boucle.
Quels sont les drapeaux disponibles et que font-ils ?
Les principaux drapeaux de regex JavaScript sont : g (global), trouver toutes les correspondances au lieu de s'arrêter à la première ; i (insensible à la casse), traiter les majuscules et les minuscules comme équivalentes ; m (multiligne), faire correspondre ^ et $ aux limites de ligne plutôt qu'aux limites de chaîne ; s (dotAll), faire correspondre le point (.) aux sauts de ligne ; u (Unicode), activer la correspondance Unicode complète et les échappements de point de code ; et d (indices), inclure les indices de début et de fin de chaque correspondance et groupe de capture dans le résultat.
Y a-t-il une limite de longueur pour la chaîne de test ou le motif ?
Aucune limite stricte n'est imposée par l'outil, mais des motifs très longs ou des chaînes de test très volumineuses peuvent rendre le navigateur peu réactif, surtout si le motif comporte des quantificateurs imbriqués susceptibles de déclencher un retour sur trace catastrophique. Les motifs à retour sur trace non borné sur de grandes entrées peuvent consommer le CPU indéfiniment. Si l'onglet du navigateur se fige, fermez-le et rouvrez-le. Pour un usage en production, testez toujours les motifs de regex contre des entrées adverses avant de les déployer.
Puis-je l'utiliser pour tester un motif de remplacement ?
Oui. Saisissez une chaîne de remplacement dans le champ de remplacement et l'outil affiche un aperçu en direct de la sortie après application de String.prototype.replace (pour la première correspondance) ou replaceAll (avec le drapeau g). La syntaxe de remplacement standard est prise en charge : $1 et $2 pour les groupes de capture numérotés, $<name> pour les groupes de capture nommés, $& pour toute la chaîne correspondante, $` pour le texte avant la correspondance et $' pour le texte après la correspondance.
Qu'est-ce que le retour sur trace catastrophique et comment l'éviter ?
Le retour sur trace catastrophique survient lorsqu'un moteur de regex explore un nombre exponentiel de chemins de correspondance possibles sur une chaîne qui ne correspond pas au motif. Il provient généralement de quantificateurs imbriqués sur des classes de caractères qui se chevauchent, par exemple (a+)+ sur une longue chaîne de caractères 'a' suivie d'un caractère qui ne peut pas correspondre. Pour l'éviter : privilégiez les motifs atomiques, utilisez des quantificateurs possessifs s'ils sont disponibles, évitez l'ambiguïté sur ce à quoi chaque partie du motif peut correspondre, et testez toujours avec des entrées conçues pour échouer en plus d'entrées conçues pour réussir.
Quelle est la différence entre un groupe capturant et un groupe non capturant ?
Un groupe capturant (...) correspond au motif à l'intérieur des parenthèses et stocke le texte correspondant afin qu'il puisse être référencé ultérieurement via $1, $2 ou les indices de groupe. Un groupe non capturant (?:...) regroupe le motif à des fins de quantification ou d'alternance sans stocker la correspondance, ce qui le rend légèrement plus efficace. Les groupes nommés (?<name>...) sont des groupes capturants qui peuvent être référencés par leur nom ($<name> dans les remplacements, match.groups.name dans le code JavaScript) plutôt que par leur indice.
Quelle est une erreur fréquente de débutant avec les expressions régulières ?
L'une des erreurs les plus fréquentes est d'oublier d'échapper le point (.) lorsqu'on veut un point littéral. Le point dans une regex correspond à n'importe quel caractère (sauf le saut de ligne par défaut), donc un motif comme 3.14 correspondra aussi à 3X14 ou 3-14. Écrivez 3\.14 pour correspondre à un point littéral. Une autre erreur fréquente est d'omettre le drapeau global (g) et de se demander pourquoi seule la première correspondance est surlignée. Un troisième écueil consiste à ancrer avec ^ et $ et à être surpris qu'ils ne correspondent aux limites de ligne que lorsque le drapeau multiligne (m) est activé.

À propos de Testeur et Débogueur de Regex

Les expressions régulières sont indispensables pour un large éventail de tâches du monde réel. La validation de formulaires, vérifier qu'une adresse e-mail, un numéro de téléphone ou un code postal correspond au format attendu, utilise presque universellement les regex. Les analyseurs de logs extraient des champs structurés de lignes de log non structurées à l'aide de groupes de capture. Les éditeurs de code et les IDE utilisent les regex pour rechercher et remplacer dans de grandes bases de code. Les outils de sécurité utilisent les regex pour détecter les motifs d'injection et les fuites de données sensibles. Les pipelines de transformation de données utilisent les regex pour normaliser des formats incohérents. Les configurations des équipements réseau sont auditées avec des regex. Comprendre et déboguer un motif de regex de manière interactive est bien plus rapide que d'exécuter un script à répétition.

Ce testeur évalue les expressions régulières JavaScript par rapport à votre saisie en temps réel, en surlignant chaque correspondance à mesure que vous tapez. Il liste tous les groupes de capture (numérotés et nommés) de chaque correspondance afin que vous puissiez voir immédiatement ce que chaque groupe a capturé. Un mode de remplacement vous permet de saisir un modèle de remplacement et de prévisualiser le résultat de String.prototype.replace ou replaceAll, avec la prise en charge des références arrière $1, $2 et $<name>. Tout s'exécute entièrement dans le moteur JavaScript de votre navigateur ; vos motifs et votre texte de saisie ne sont jamais envoyés à un serveur.

Il est notoirement facile de se tromper subtilement avec une regex. Un point seul (.) correspond à n'importe quel caractère, y compris les sauts de ligne dans certains modes, et pas seulement à un point littéral. Les quantificateurs gourmands (*, +) correspondent au maximum possible, capturant souvent plus que prévu ; utilisez les versions paresseuses (*?, +?) pour correspondre au minimum possible. Les ancres ^ et $ correspondent au début et à la fin de toute la chaîne par défaut ; ajoutez le drapeau multiligne (m) si vous voulez qu'elles correspondent aux limites de ligne. Le retour sur trace catastrophique (catastrophic backtracking), où une regex mal écrite provoque un temps de correspondance exponentiel sur une entrée adverse, est un risque réel de déni de service dans les applications web qui appliquent des motifs fournis par l'utilisateur à du texte fourni par l'utilisateur.

De la théorie des langages formels à grep

Le concept d'expressions régulières trouve son origine dans l'informatique théorique. En 1956, le mathématicien Stephen Cole Kleene a publié un article décrivant les « événements réguliers », des ensembles de chaînes pouvant être décrits par un automate fini, et a introduit la notation algébrique qui allait devenir la syntaxe des regex. L'opérateur étoile (*), appelé l'étoile de Kleene, porte son nom. À ce stade, les expressions régulières n'étaient qu'une abstraction mathématique sans lien avec la pratique informatique.

Le passage de la théorie à l'outil est intervenu en 1968, lorsque Ken Thompson a implémenté la recherche par regex dans l'éditeur de texte QED, puis dans l'outil Unix grep (dont le nom signifie 'globally search a regular expression and print'). L'innovation clé de Thompson a été un algorithme efficace qui convertissait une expression régulière en un automate fini non déterministe (NFA) et le simulait, garantissant une correspondance en temps linéaire sans retour sur trace catastrophique. De nombreux moteurs de regex modernes ont abandonné l'approche NFA de Thompson au profit de moteurs à retour sur trace qui prennent en charge plus de fonctionnalités (comme les références arrière) mais peuvent présenter un comportement exponentiel dans le pire des cas.

Aujourd'hui, les expressions régulières sont prises en charge nativement dans pratiquement tous les langages de programmation et éditeurs de texte. Pourtant, la syntaxe s'est fragmentée en des dizaines de variantes incompatibles, POSIX BRE, POSIX ERE, PCRE, .NET, Java, Python, JavaScript, Ruby, chacune avec de subtiles différences de syntaxe et de sémantique. Une regex écrite pour un langage fonctionnera souvent dans un autre, mais les cas limites abondent. Cette fragmentation explique pourquoi il est toujours recommandé de tester un motif dans le moteur précis que vous allez réellement utiliser avant de le déployer en production.

Publicité
Publicité
Publicité