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

  1. Collez une regex brute (par exemple `\d{4}-\d{2}`) ou délimitée (`/\d{4}-\d{2}/g`) ; rien ne quitte votre navigateur.
  2. Sélectionnez « Vérifier le motif ».
  3. Examinez chaque construction signalée : erreur de syntaxe ailleurs, changement silencieux de comportement ou note de compatibilité dans un seul sens.
  4. 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

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
Erreurs fréquentes

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.