MiServe DevTools

Vos autocollants

Épinglez vos outils ici. Ils sont enregistrés dans ce navigateur.

Testeur de regex pour JavaScript et Go (RE2)

Testez une expression régulière sur votre texte avec le moteur de JavaScript ou celui de Go (RE2), et voyez chaque correspondance, chaque groupe capturant et le résultat du remplacement.

Marqueurs

Correspondances dans le texte

Aide-mémoire de la syntaxe des deux moteurs
SyntaxeSignificationJavaScriptGo (RE2)
. N'importe quel caractère sauf un saut de ligne. Avec le marqueur s, il inclut aussi les sauts de ligne. Oui Oui
\d \w \s Un chiffre, un caractère de mot, un caractère d'espacement. Les majuscules \D, \W et \S désignent l'inverse. Oui Oui
[abc] [^abc] [a-z] Un caractère d'un ensemble, un caractère absent de l'ensemble, un caractère compris dans un intervalle. Oui Oui
^ $ Début et fin du texte. Avec le marqueur m, début et fin de chaque ligne. Oui Oui
\b \B Une limite de mot, et une position qui n'est pas une limite de mot. Oui Oui
* + ? {2,5} Zéro ou plus, un ou plus, zéro ou un, entre 2 et 5 fois. Chacun prend le plus possible. Oui Oui
*? +? ?? {2,5}? Les mêmes quantificateurs, qui prennent le moins possible. Oui Oui
(…) (?:…) Un groupe capturant, et un groupe qui ne fait que regrouper. Oui Oui
(?<name>…) Un groupe capturant nommé. Go accepte cette forme depuis la version 1.22, et (?P<name>…) dans toutes les versions. Oui Oui
a|b Soit a, soit b. Oui Oui
\p{L} \p{Lu} Une propriété Unicode : n'importe quelle lettre, n'importe quelle lettre majuscule. En JavaScript, il faut le marqueur u. Oui Oui
(?i) (?s) (?m) Marqueurs écrits dans le motif. En JavaScript, les marqueurs se définissent à l'extérieur. Non Oui
\A \z Début et fin du texte entier, quel que soit le marqueur m. Non Oui
[[:alpha:]] Une classe de caractères POSIX à l'intérieur d'un ensemble. Non Oui
(?=…) (?!…) Assertion avant (lookahead) : ce qui suit doit correspondre, ou ne doit pas correspondre, sans être consommé. Oui Non
(?<=…) (?<!…) Assertion arrière (lookbehind) : ce qui précède doit correspondre, ou ne doit pas correspondre. Oui Non
\1 \k<name> Référence arrière : le même texte que celui capturé par un groupe précédent. Oui Non

S'exécute dans votre navigateur avec WebAssembly. Rien de ce que vous collez n'est envoyé.

À propos de cet outil

Deux moteurs, deux familles

Les moteurs d'expressions régulières se répartissent en deux familles. Les moteurs à backtracking, comme PCRE et les moteurs par défaut de JavaScript, Python, Java et .NET, essaient un chemin dans le motif et reviennent en arrière quand il échoue. C'est ce fonctionnement qui rend possibles les assertions avant et arrière et les références arrière. Les moteurs à automate, comme RE2 et le package regexp de Go, suivent tous les chemins possibles à la fois : leur temps d'exécution croît donc linéairement avec la longueur du texte. En contrepartie, les assertions (lookaround) et les références arrière ne sont pas disponibles.

Le moteur JavaScript est ici le RegExp de votre navigateur. Le moteur Go est le package standard regexp de Go compilé en WebAssembly : le code qui exécute votre motif ici est donc celui qui l'exécute dans un programme Go. Go accepte la syntaxe de RE2.

Lire les résultats

Chaque correspondance est encadrée et surlignée dans le texte, en deux couleurs alternées pour distinguer les correspondances qui se touchent. Une correspondance vide, comme celle que x* trouve entre deux lettres, est représentée par une fine barre. Le tableau donne le début et la fin de chaque correspondance et le texte de chaque groupe capturant. Un groupe qui n'a pas participé à une correspondance est marqué « non capturé », ce qui n'est pas la même chose qu'un groupe qui a capturé une chaîne vide.

Les positions comptent les unités de code UTF-16 à partir de zéro, et la fin est exclue : ce sont les nombres que vous passez à String.prototype.slice en JavaScript. Go renvoie, lui, des décalages en octets dans le texte UTF-8 ; l'outil les convertit, si bien que les deux moteurs affichent les mêmes nombres.

En JavaScript, un motif sans le marqueur g ne trouve que la première correspondance et ne remplace que celle-ci. Le moteur Go renvoie toujours toutes les correspondances, comme le font FindAllStringSubmatchIndex et ReplaceAllString.

Le backtracking catastrophique

Un moteur à backtracking peut avoir besoin d'un temps exponentiel quand des quantificateurs sont imbriqués ou se chevauchent. Le cas classique est (a+)+$ testé sur une longue suite de a suivie d'un autre caractère : le moteur essaie toutes les façons de répartir la suite entre le quantificateur intérieur et le quantificateur extérieur avant d'abandonner. Sur un serveur, c'est un risque de déni de service connu sous le nom de ReDoS.

Cet outil exécute les motifs JavaScript dans un worker d'arrière-plan et arrête le worker au bout de 1,5 seconde : la page reste réactive et vous indique ce qui s'est passé. Tester le même motif avec le moteur Go permet de voir rapidement si la lenteur vient du backtracking, puisque Go garantit un temps d'exécution linéaire par rapport à la longueur du texte.

Questions

Pourquoi mon motif fonctionne-t-il en JavaScript mais pas en Go ?

Une cause fréquente est une assertion avant, une assertion arrière ou une référence arrière, que RE2 laisse de côté pour pouvoir garantir un temps d'exécution linéaire. Les marqueurs sont une autre cause fréquente : Go n'a pas de marqueurs en dehors du motif, et la recherche insensible à la casse s'écrit donc (?i) au début de celui-ci.

En quoi les chaînes de remplacement diffèrent-elles entre JavaScript et Go ?

Les deux utilisent $1 pour le premier groupe. Un groupe nommé s'écrit $<name> en JavaScript et ${name} en Go. En Go, $1x désigne un groupe nommé 1x : écrivez donc ${1}x quand une lettre, un chiffre ou un tiret bas suit la référence.

Puis-je tester ici des motifs PCRE, Python ou Java ?

Seuls les moteurs JavaScript et Go s'exécutent sur cette page. La syntaxe courante est commune aux différentes variantes, donc le moteur JavaScript donne une bonne approximation pour les motifs simples, mais des fonctionnalités comme les quantificateurs possessifs, les groupes atomiques et la récursion ne sont disponibles dans aucun des deux moteurs.

Le texte que je teste est-il envoyé à un serveur ?

Non. Les deux moteurs s'exécutent dans votre navigateur : JavaScript dans un worker d'arrière-plan, Go sous forme de module WebAssembly. L'outil n'envoie aucune requête réseau avec votre motif ni avec votre texte, et la politique de sécurité du site bloque les requêtes vers tout autre hôte.

Autres outils de la catégorie Texte