web-dev-qa-db-fra.com

Comment déboguez-vous une expression régulière?

Les expressions régulières peuvent devenir assez complexes. Le manque d'espace blanc les rend difficiles à lire. Je ne peux pas parcourir une expression régulière avec un débogueur. Alors, comment les experts déboguent-ils les expressions régulières complexes?

145
rook

Vous achetez RegexBuddy et utilisez sa fonction intégrée fonction de débogage . Si vous travaillez avec des regex plus de deux fois par an, vous gagnerez cet argent en un temps record en un rien de temps. RegexBuddy vous aidera également à créer des expressions régulières simples et complexes, et même à générer le code pour vous dans une variété de langues.

alt text

De plus, selon le développeur, cet outil fonctionne presque parfaitement sur Linux lorsqu'il est utilisé avec WINE .

67
Mick

Avec Perl 5.10, use re 'debug'; . (Ou debugcolor, mais je ne peux pas formater correctement la sortie sur Stack Overflow.)

 $ Perl -Mre = debug -e '"foobar" = ~/(.)\1 /'
 Compilation de REx "(.)\1" 
 Programme final: 
 1: OUVERT1 (3) 
 3: REG_ANY (4) 
 4: FERMÉ1 (6) 
 6: REF1 (8) 
 8: FIN (0) 
 Minlen 1 
 Correspondant REx "(.)\1" contre "foobar" 
 0 <> <foobar> | 1: OUVERT1 (3) 
 0 <> <foobar> | 3: REG_ANY (4) 
 1 <f> <oobar> | 4: CLOSE1 (6) 
 1 <f> <oobar> | 6: REF1 (8) 
 A échoué ... 
 1 <f> <oobar> | 1: OUVERT1 (3) 
 1 <f> <oobar> | 3: REG_ANY (4) 
 2 <fo> <obar> | 4: FERMER1 (6) 
 2 <fo> <obar> | 6: REF1 (8) 
 3 <foo> <bar> | 8: FIN (0) 
 Correspondance réussie! 
 Libération de REx: "(.)\1" 

De plus, vous pouvez ajouter des espaces et des commentaires aux expressions rationnelles pour les rendre plus lisibles. En Perl, cela se fait avec le /x modificateur. Avec pcre, il y a le PCRE_EXTENDED drapeau.

"foobar" =~ /
    (.)  # any character, followed by a
    \1   # repeat of previously matched character
/x;

pcre *pat = pcre_compile("(.)  # any character, followed by a\n"
                         "\\1  # repeat of previously matched character\n",
                         PCRE_EXTENDED,
                         ...);
pcre_exec(pat, NULL, "foobar", ...);
51
ephemient

J'en ajouterai un autre pour ne pas l'oublier: debuggex

C'est bien car c'est très visuel: Photo of the Debuggex regex helper

29
kevin

Quand je suis coincé sur une expression régulière, je me tourne généralement vers ceci: https://regexr.com/

C'est parfait pour tester rapidement où quelque chose ne va pas.

28
thetaiko

J'utilise Kodos - Le Python Débogueur d'expressions régulières:

Kodos est un Python GUI utilitaire pour créer, tester et déboguer des expressions régulières pour le langage de programmation Python. Kodos devrait aider tout développeur à développer efficacement et sans effort des expressions régulières Étant donné que l'implémentation des expressions régulières de Python est basée sur la norme PCRE , Kodos devrait bénéficier aux développeurs dans d'autres langages de programmation qui adhèrent également à la norme PCRE (Perl , PHP, etc ...).

(...)

alt text

Fonctionne sur Linux, Unix, Windows, Mac.

18
Pascal Thivent

Je pense que non. Si votre expression rationnelle est trop compliquée et si problématique que vous avez besoin d'un débogueur, vous devez créer un analyseur spécifique ou utiliser une autre méthode. Il sera beaucoup plus lisible et maintenable.

13
Valentin Rocher

Il existe un excellent outil gratuit, le coach Regex . La dernière version n'est disponible que pour Windows; son auteur, le Dr Edmund Weitz, a cessé de maintenir la version Linux car trop peu de personnes l'ont téléchargée, mais il existe une ancienne version pour Linux sur la page de téléchargement.

11
APC

Je viens de voir une présentation de Regexp :: Debugger par son créateur: Damian Conway. Des choses très impressionnantes: exécutées sur place ou à l'aide d'un outil de ligne de commande (rxrx), de manière interactive ou sur un fichier d'exécution "journalisé" (stocké dans JSON), avancer et reculer à tout moment, s'arrêter sur des points d'arrêt ou des événements, sortie colorée (configurable par l'utilisateur ), cartes de chaleur sur regexp et chaîne pour l'optimisation, etc ...

Disponible gratuitement sur CPAN: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm

8
Yves

J'utilise cet outil en ligne pour déboguer mon expression régulière:

http://www.regextester.com/

Mais oui, il ne peut pas battre RegexBuddy.

7
gfe

Je débogue mes regex de mes propres yeux. C'est pourquoi j'utilise /x modificateur, rédigez des commentaires à leur sujet et divisez-les en plusieurs parties. Lisez Jeffrey Friedl's Mastering Regular Expressions pour apprendre à développer des expressions régulières rapides et lisibles. Divers outils de débogage de regex provoquent simplement une programmation vaudou.

6
codeholic

Quant à moi, j'utilise habituellement l'utilitaire pcretest qui peut vider le code d'octet de toute expression régulière, et il est généralement beaucoup plus facile à lire (pour moi au moins). Exemple:

PCRE version 8.30-PT1 2012-01-01

  re> /ab|c[de]/iB
------------------------------------------------------------------
  0   7 Bra
  3  /i ab
  7  38 Alt
 10  /i c
 12     [DEde]
 45  45 Ket
 48     End
------------------------------------------------------------------
5
dark100

Si je me sens coincé, j'aime revenir en arrière et générer le regex directement à partir d'un exemple de texte en utilisant txt2re (bien que je finisse généralement par peaufiner le regex résultant à la main).

3
eggsyntax

J'utilise:

http://regexlib.com/RETester.aspx

Vous pouvez également essayer Regex Hero (utilise Silverlight):

http://regexhero.net/tester/

3
Leniel Maccaferri

Si vous êtes un utilisateur Mac, je suis juste tombé sur celui-ci:

http://atastypixel.com/blog/reginald-regex-Explorer/

C'est gratuit et simple à utiliser, et cela m'a été d'une grande aide pour me familiariser avec les RegEx en général.

3
jayp

J'utilise le Rx Toolkit inclus avec ActiveState Komodo .

2
Czechnology

J'utilise souvent Ruby testeur d'expressions rationnelles basé sur Rubular

et aussi dans Emacs M-x reconstructeur

Firefox a également une extension utile

2
ocodo

Écrire des ex ex en utilisant une notation comme les PCRE, c'est comme écrire un assembleur: c'est bien si vous pouvez juste voir les automates à états finis correspondants dans votre tête, mais cela peut devenir difficile à maintenir très rapidement.

Les raisons de ne pas utiliser un débogueur sont à peu près les mêmes que pour ne pas utiliser un débogueur avec un langage de programmation: vous pouvez corriger les erreurs locales, mais elles ne vous aideront pas à résoudre les problèmes de conception qui vous ont amené à faire les erreurs locales dans le premier endroit.

La manière la plus réfléchie consiste à utiliser des représentations de données pour générer des expressions rationnelles dans votre langage de programmation et à disposer d'abstractions appropriées pour les créer. introduction d'Olin Shiver à sa notation d'expression rationnelle de schéma donne un excellent aperçu des problèmes rencontrés dans la conception de ces représentations de données.

2
Charles Stewart
2
Skilldrick

J'utilise souvent pcretest - à peine un "débogueur" mais il fonctionne sur une connexion SSH en texte uniquement et analyse exactement le dialecte regex dont j'ai besoin: mon code (C++) lie à libpcre, donc il n'y a aucune difficulté avec des différences subtiles dans ce qui est magique et quoi n'est pas, etc.

En général, je suis d'accord avec le gars ci-dessus pour qui avoir besoin d'un débogueur regex est une odeur de code. Pour moi, le plus difficile à utiliser des expressions régulières n'est généralement pas l'expression régulière elle-même, mais les multiples couches de devis nécessaires pour les faire fonctionner.

2
Bernd Jendrissek

Vous pouvez essayer celui-ci http://www.pagecolumn.com/tool/regtest.htm

1
Eugeniu Torica

Pour moi, après avoir regardé le regex (car je parle assez couramment et utilise presque toujours/x ou équivalent), je pourrais déboguer plutôt que de tester si je ne suis pas sûr de toucher une correspondance dégénérée (c'est-à-dire quelque chose qui revient excessivement en arrière) pour voir si je pouvais résoudre de tels problèmes en modifiant la gourmandise d'un opérateur par exemple.

Pour ce faire, j'utiliserais l'une des méthodes mentionnées ci-dessus: pcretest, RegexBuddy (si mon lieu de travail actuel l'a autorisé) ou similaire, et parfois je le chronomètre dans Linqpad si je travaille dans des expressions régulières C #.

(L'astuce Perl est nouvelle pour moi, alors j'ajouterai probablement cela à ma boîte à outils regex aussi.)

0
ChrisF