Vérificateur de portabilité des expressions régulières
Collez une expression régulière, brute ou au format JS `/pattern/flags`, pour repérer les parties qui échoueraient ou se comporteraient silencieusement différemment dans `re` de Python ou un moteur de la famille PCRE (PHP, Perl), et comprendre pourquoi.
Traitement effectué localement dans votre navigateur. Votre fichier n’est jamais téléversé.
Comment utiliser cet outil outil
- Collez une regex brute (par exemple `\d{4}-\d{2}`) ou délimitée (`/\d{4}-\d{2}/g`) ; rien ne quitte votre navigateur.
- Sélectionnez « Vérifier le motif ».
- Examinez chaque construction signalée : erreur de syntaxe ailleurs, changement silencieux de comportement ou note de compatibilité dans un seul sens.
- Utilisez la réécriture proposée lorsqu'elle existe. Certaines constructions (quantificateurs possessifs, groupes atomiques, récursion) n'ont pas d'équivalent JS mécanique simple et sont expliquées plutôt que devinées.
Hypothèses
- Analyse statique du texte du motif, pas moteur regex : le motif n'est jamais exécuté sur un texte d'exemple et la grammaire complète n'est pas analysée (classes de caractères, groupes imbriqués, cas limites d'échappement hors règles ciblées).
- Comparaison limitée à trois écosystèmes : RegExp JavaScript (ECMAScript), module `re` Python et famille PCRE, suivie de près par `preg_*` de PHP et les regex de Perl.
- Seules les divergences documentées au niveau des spécifications sont signalées ; bizarreries obscures propres à un moteur et bogues de version ne sont pas couverts.
Sources et données de référence
Méthodologie
Le corps du motif (délimiteurs `/pattern/flags` éventuels retirés) est recherché pour huit constructions problématiques : syntaxe de groupes nommés/références arrière propre à Python, quantificateurs possessifs, groupes atomiques, ancres `\A`/`\Z`/`\z`, références récursives PCRE, indicateurs en ligne au milieu du motif et différences ASCII/Unicode par défaut pour `\d`/`\w`/`\s`. Chaque vérification repose sur un motif ciblé, pas un analyseur regex général. Une réécriture n'est proposée que si elle est mécaniquement sûre et sans ambiguïté.
Exemple détaillé
Ancres `\A` et `\Z`
Données d’entrée: /\Afoo.*bar\Z/
Résultat: JavaScript ne possède pas les ancres `\A` ou `\Z` : il lit silencieusement `\A` comme la lettre littérale A et `\Z` comme Z ; le motif correspond alors à quelque chose de complètement différent au lieu d'échouer à la compilation. Signalé comme erreur précisément parce que l'échec est silencieux.
Groupe nommé au format Python
Données d’entrée: (?P<year>\d{4})
Résultat: `(?P<year>...)` provoque une SyntaxError en JavaScript, qui exige `(?<year>...)` sans P. Le P est retiré de façon sûre ; PCRE et .NET acceptent aussi la forme simple.
Quantificateur possessif et groupe atomique
Données d’entrée: (?>a++)b
Résultat: `(?>...)` (groupe atomique) et `a++` (quantificateur possessif) sont des constructions PCRE/Java sans syntaxe équivalente en JavaScript. Tous deux sont signalés comme erreurs sans réécriture automatique : reproduire leur effet en JS demande de restructurer le motif avec une anticipation capturante, pas de substituer du texte.
Ancre de début au format Python
Données d’entrée: /\Afoo/
Résultat: Python et d'autres moteurs utilisent `\A` pour le début absolu de la chaîne. JavaScript n'a pas cette ancre : l'échappement n'ancre pas le début et peut être traité comme un échappement d'identité correspondant à A. Le vérificateur repère la construction dans le texte sans l'exécuter sur des chaînes.
Conseils pratiques
- Ne comptez pas sur `\A` ni `\Z`/`\z` si le motif peut être exécuté en JavaScript ; utilisez `^`/`$` avec l'indicateur `m` volontairement désactivé et vérifiez le comportement voulu avec une nouvelle ligne finale.
- Pour un motif Python/JavaScript, les groupes nommés n'ont pas une syntaxe commune : Python `re` exige `(?P<name>...)`, tandis que JS requiert `(?<name>...)`. Adaptez le motif par langage.
- Considérez les quantificateurs possessifs, groupes atomiques et motifs récursifs comme un signe qu'il faut restructurer le motif (ou utiliser un véritable analyseur) avant son exécution en JavaScript : aucun remplacement direct n'existe.
Erreurs fréquentes
- Supposer qu'un motif compilant en JS se comporte comme sa version Python/PCRE : `\A`/`\Z` et les valeurs par défaut Unicode de `\d`/`\w`/`\s` compilent, mais correspondent à des choses différentes.
- Traiter `(?<name>...)` comme portable partout : valide en JS, PCRE et .NET, cette forme est rejetée par `re` de Python qui exige P.
Questions fréquentes
Pourquoi `\A`/`\Z` sont-elles plus dangereuses que les constructions possessives ou les groupes atomiques ?
Quantificateurs possessifs et groupes atomiques provoquent des SyntaxError (ou équivalent) en JavaScript : l'erreur est immédiate et visible. `\A` et `\Z` compilent et correspondent silencieusement aux lettres A/Z au lieu d'ancrer ; le problème reste invisible jusqu'à un mauvais résultat sur des données réelles.
Pourquoi suggérer `(?<name>...)` pour JS et le signaler pour Python au lieu d'en choisir une ?
La forme correcte dépend du moteur : JS/PCRE/.NET utilisent la forme sans P, Python exige P. L'outil ignore l'environnement cible ; il signale les deux sens et ne réécrit de force que la forme clairement invalide pour JS, telle que `(?P<name>...)`.
L'outil peut-il corriger automatiquement un quantificateur possessif ou un groupe atomique ?
Non. Reproduire leur effet en JavaScript demande généralement d'émuler le groupe atomique avec une anticipation capturante (`(?=(pattern))\1`), ce qui modifie la structure du motif et non son seul texte. C'est une décision du responsable du motif, que l'outil ne devine pas.
Dernière vérification : 2026-09-25
Analyseur textuel ciblé, construction par construction, pas moteur ni analyseur regex : reconnaît huit problèmes de portabilité documentés et rien d'autre. Extensions inhabituelles propres aux moteurs, cas de groupes imbriqués et comportement réel des correspondances ne sont pas couverts ; le motif n'est jamais exécuté.
Les préférences de thème et d’outils, ainsi que les listes enregistrées et récemment utilisées, sont stockées uniquement dans ce navigateur.