Testeur de Regex

Testez des expressions régulières JavaScript contre votre propre texte. Basculez les drapeaux g, i, m, s et u, inspectez chaque correspondance avec son index et ses groupes capturants, et prévisualisez le résultat du remplacement en direct.

Voyez chaque correspondance, chaque groupe et chaque index en temps réel. Saisissez un motif et un texte à tester. Chaque résultat est listé avec sa position et ses groupes capturants, les motifs invalides signalent le message d'erreur propre au moteur, et le champ de remplacement montre exactement ce qu'un appel replace produirait.

/ / g
Correspondances

Lire une expression régulière comme le fait le moteur

Les drapeaux changent le sens, pas seulement la recherche

Les cinq drapeaux ne sont pas des préférences, ils redéfinissent le motif. Sans g, une recherche renvoie la première correspondance et s'arrête ; avec lui, le moteur conserve un curseur lastIndex et parcourt toute la chaîne, ce qui explique aussi pourquoi une regex globale réutilisée entre plusieurs appels peut sembler sauter des correspondances. Le drapeau i replie la casse en utilisant le mapping de casse Unicode plutôt qu'un simple décalage ASCII.

Les deux les plus mal compris sont m et s. m ne change que ce que signifient ^ et $, les ancrant aux limites de ligne plutôt qu'à toute la chaîne ; il ne fait rien à .. À l'inverse, s ne change que ., lui permettant de correspondre à un saut de ligne. Le nom « dotall » est celui à retenir. Le drapeau u fait opérer le motif sur les points de code plutôt que sur les unités UTF-16, donc . correspond à un emoji comme une seule unité et les escapes \u{1F600} deviennent légales. Il rend aussi erreur les escapes auparavant tolérées, voilà pourquoi un motif existant peut se briser dès que vous l'ajoutez.

Groupes, index et remplacement

Chaque section entre parenthèses capture par défaut, numérotée par l'ordre de sa parenthèse ouvrante, et ces numéros sont ce que $1 et $2 désignent dans un remplacement. L'imbrication suit la même règle, donc dans ((a)b) le groupe un est ab et le groupe deux est a. Quand vous n'avez besoin du groupement que pour l'alternation ou la répétition, (?:...) évite d'allouer une capture et garde la numérotation lisible.

L'index rapporté pour chaque correspondance est le décalage du premier caractère capturé, ce qui compte plus qu'il n'y paraît. Il permet de distinguer deux correspondances identiques à des positions différentes, de confirmer qu'une ancre a fait ce que vous attendiez, et de diagnostiquer la correspondance classique de longueur nulle. Un motif comme \d* correspond à la chaîne vide partout, donc une analyse globale trouve une correspondance à chaque position ; le moteur n'avance que parce que les implémentations forcent le curseur en avant quand la correspondance est vide.

Retour en arrière et limite de correspondance

La plupart des moteurs, dont celui de JavaScript, utilisent le retour en arrière. Quand une partie du motif échoue, le moteur revient au dernier point de décision et tente un autre chemin. D'ordinaire cela est invisible. Cela devient catastrophique quand des quantificateurs imbriqués font croître le nombre de chemins de façon exponentielle, la forme classique étant (a+)+b contre une longue suite de caractères a sans b. Cette entrée peut bloquer un onglet de navigateur, et si le motif vient d'une entrée utilisateur, il devient un vecteur de déni de service.

Deux habitudes évitent presque tout : préférez des classes de caractères spécifiques à .* pour que les alternatives ne puissent pas se chevaucher, et ancrez les motifs quand vous le pouvez, puisqu'un échec ancré est rejeté immédiatement au lieu d'être retenté à chaque décalage. Cet outil limite aussi les résultats à 500 correspondances et vous indique quand il les a tronqués, donc un motif incontrôlable dégrade en un résultat lent plutôt qu'en une page figée.

Note open-source : implémenté en JavaScript vanilla sans bibliothèque tierce.

FAQ

Quelle variante de regex cet outil utilise-t-il ?
JavaScript, c'est-à-dire le moteur ECMAScript intégré à votre navigateur. Les motifs Perl, PCRE et Python s'en rapprochent mais diffèrent sur le lookbehind, les groupes nommés et certains escapes.
Que change réellement le drapeau g ?
Sans lui vous n'obtenez que la première correspondance. Avec lui, le moteur analyse toute la chaîne et renvoie chaque correspondance, ce qui remplit la liste ici.
Pourquoi obtiens-je des correspondances vides ?
Votre motif peut correspondre à zéro caractère, comme le fait `\d*`. Une analyse globale signale alors une correspondance à chaque position, et le moteur avance manuellement pour éviter la boucle.
Comment référencer les groupes capturants dans le remplacement ?
Utilisez $1 pour le premier groupe, $2 pour le second, et $& pour toute la correspondance. Écrivez $$ si vous avez besoin d'un signe dollar littéral.
Que signifie « affichage des 500 premiers » ?
La liste de résultats est plafonnée à 500 correspondances pour qu'un motif très large ne fige pas la page. L'aperçu de remplacement s'applique toujours à tout le texte.
Pourquoi mon motif ralentit-il la page ?
Des quantificateurs imbriqués comme (a+)+ provoquent un retour en arrière exponentiel. Utilisez des classes de caractères spécifiques au lieu de .* et ancrez le motif pour garder une correspondance linéaire.