Comment déboguer une regex? [fermé]


149

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 des expressions régulières complexes?


2
Je crois que "tester" votre regex est bien plus important que le "déboguer". Vous pouvez généralement comprendre ce qui se passe avec une regex assez facilement en regardant le résultat (ou en utilisant l'un des outils suggérés dans les réponses), mais pour être vraiment sûr qu'il fait ce que vous voulez dire, vous devriez tester votre regex avec tous les cas de bordure possibles. Les tests clarifieront finalement ce que vous voulez vraiment faire et rendront le débogage inutile :)
baol

7
Cela semble intéressant: http://www.debuggex.com/ (Puisque la question est fermée, je ne peux pas ajouter de vraie réponse.)
KajMagnus

Si vous avez Visual Studio, vous pouvez définir un point d'arrêt près de votre zone de problème (par exemple RegEx.Replace(...)'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
:,

2
Je suis très surpris que personne ne semble avoir mentionné regex101.com qui a un débogueur réel et est également hébergé sur le Web.
mechalynx

1
même en 2017, je pense que regexbuddy est toujours le meilleur outil que je puisse trouver, et le prix reste à 40 $. Je travaille souvent dans différentes langues avec différentes saveurs de regex, donc je suis souvent confus. Avec regexbuddy, ça me libère de la syntaxe
code4j

Réponses:


68

Vous achetez RegexBuddy et utilisez sa fonction de débogage intégrée . Si vous travaillez avec des regex plus de deux fois par an, vous récupérerez cet argent 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.

texte alternatif

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


31
Dommage qu'il soit uniquement Windows et coûte 40 $ US.
kennytm

25
Il fonctionne sous Linux via WINE, selon le développeur: regexbuddy.com/wine.html . Et à propos du coût de 40 $ ... combien vaut votre temps?
Mick

18
Ce n'est pas un logiciel libre.
codeholic

38
Qui a dit que c'était ou demandé?
Tim Pietzcker

21
Eh bien, comme Mick l'a dit, combien vaut votre temps? «Les meilleurs outils que l'argent peut acheter» ne doivent pas toujours coûter de l'argent, mais parfois ils le font. De plus, JGSoft développe constamment des produits de grande qualité avec un service utilisateur exceptionnel. Je leur ai même acheté des logiciels dont je n'ai pas vraiment besoin (comme RegexMagic) parce que j'aimerais les soutenir et les maintenir en activité. Vous ne savez pas ce que vous manquez. Sérieusement.
Tim Pietzcker

52

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

$ perl -Mre = debug -e '"foobar" = ~ / (.) \ 1 /'
Compilation de REx "(.) \ 1"
Programme final:
   1: OUVERT1 (3)
   3: REG_ANY (4)
   4: FERMER1 (6)
   6: REF1 (8)
   8: FIN (0)
minlen 1
Correspondance entre REx "(.) \ 1" et "foobar"
   0 <> <foobar> | 1: OUVERT1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: FERMER1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  é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)
Match réussi!
Libération de REx: "(.) \ 1"

En outre, vous pouvez ajouter des espaces et des commentaires aux expressions régulières pour les rendre plus lisibles. En Perl, cela se fait avec le /xmodificateur. Avec pcre, il y a le PCRE_EXTENDEDdrapeau.

"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", ...);

12
+1: Pourquoi quelqu'un préférerait-il Regexbuddy à ça?
Charles Stewart

1
J'aime cette méthode, même si je pense que le copain regex est meilleur.
tour

echo "foobar" | egrep "(.) \ 1"
DmitrySandalov

30

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

C'est bien car c'est très visuel: Photo de l'assistant de regex Debuggex


debuggex ne fonctionne pas vraiment pour moi: les polices sont appliquées par JavaScript, apparemment, et ne fonctionnent pas (j'ai des polices monospaces, la console Firefox les utilise parfaitement). En conséquence, l'écran est inutilisable. De plus, les tests JavaScript bloquent le navigateur avec de nombreux cas de test, pour chaque édition (pas seulement une fois lors du déclenchement). Enfin, certaines des expressions régulières proposées sont buggées et ne correspondent pas comme prévu.
7heo.tk

28

Lorsque je suis coincé sur une regex, je me tourne généralement vers ceci: https://regexr.com/

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


1
Cet outil est vraiment utile: il est hébergé sur le Web donc pas d'installation, il est en temps réel donc le débogage est un rêve, et il a même des info-bulles utiles et une liste de caractères spéciaux, au cas où vous ne vous souviendriez pas de quelque chose. C'est parfait, merci beaucoup
Jason Ridge

Malheureusement, cet outil ne vous permet pas (toujours) de changer les délimiteurs de regex (même pour le moteur PCRE) - ils sont fixés comme /(barres obliques). C'est un spectacle pour moi.
MrWhite

19

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

Kodos est un utilitaire d'interface graphique Python 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 en Python. Puisque l'implémentation des expressions régulières par Python est basée sur le standard PCRE , Kodos devrait bénéficier aux développeurs d'autres langages de programmation qui adhèrent également au standard PCRE (Perl, PHP, etc ...).

(...)

texte alternatif

Fonctionne sous Linux, Unix, Windows, Mac.


2
Kodos ne fournit pas de véritables fonctionnalités de débogage. Vous ne pouvez pas exécuter l'expression régulière ni interrompre l'exécution.
candide

Des conseils pour le faire fonctionner sur un Mac? Le site Sourceforge n'offre aucune information sur l'installation pour Mac, et mon Google-fu semble me faire défaut.
Adam Parkin

Bien que cela semble être Python2, et n'a pas été mis à jour depuis 2006 (il y a 14 ans au moment de la rédaction)?
MrWhite

13

Je pense que non. Si votre expression régulière est trop compliquée et problématique au point que vous ayez besoin d'un débogueur, vous devriez créer un analyseur spécifique ou utiliser une autre méthode. Il sera beaucoup plus lisible et maintenable.


4
Mec, tu as posté ça après avoir regardé la capture d'écran de regexbuddy?
tour du

2
Tout le monde sera en désaccord avec cela, mais ce n'est pas une mauvaise idée. Tout le monde suppose que le moteur regex est le plus efficace avec d'énormes regex. Ce n'est pas forcément vrai et ils ne sont certainement pas faciles à lire. Brisez vos expressions régulières.
Dan Rosenstark

1
@Michael Brooks: Non, avant, en fait. Après avoir vu la capture d'écran, je suis d'accord avec le fait que vous POUVEZ déboguer une expression rationnelle. Mais je reste sur mon idée: lorsqu'une expression rationnelle devient trop compliquée, il est temps de passer à une autre manière.
Valentin Rocher

12

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


8

Je viens de voir une présentation de Regexp :: Debugger par son créateur: Damian Conway. Des trucs très impressionnants: exécutez en place ou en utilisant un outil de ligne de commande (rxrx), de manière interactive ou sur un fichier d'exécution "journalisé" (stocké en 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 thermiques sur expression régulière et chaîne pour l'optimisation, etc ...

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


OP a dit "Je ne peux pas parcourir une expression régulière avec un débogueur."
quantum

Avez-vous un lien vers la présentation?
tour du

3
@Rook, vous pouvez voir la présentation sur youtube.com/watch?v=zcSFIUiMgAs
Starfish


6

Je débogue mes expressions régulières de mes propres yeux. C'est pourquoi j'utilise un /xmodificateur, j'écris des commentaires pour eux et je les divise en parties. Lisez Mastering Regular Expressions de Jeffrey Friedl pour apprendre à développer des expressions régulières rapides et lisibles. Divers outils de débogage regex ne font que provoquer la programmation vaudou.


5

Quant à moi, j'utilise généralement l'utilitaire pcretest qui peut vider le byte code de n'importe quelle regex, et il est généralement beaucoup plus facile à lire (du moins pour moi). 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
------------------------------------------------------------------


3

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




2

Ecrire des reg exes en utilisant une notation comme PCRE 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 de débogueur sont sensiblement les mêmes que celles de ne pas utiliser de 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 conduit à 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 construire. L'introduction d'Olin Shiver à son système de notation regexp donne un excellent aperçu des problèmes rencontrés dans la conception de ces représentations de données.


Les combinateurs d'analyseurs sont en effet un excellent moyen d'aller: Parsec et PArrows en Haskell, rsec en Ruby, Boost Spirit en C ++, PyParsing en Python, Perl6 :: Rules en Perl, etc.
éphémère

2

J'utilise souvent pcretest - à peine un "débogueur" mais il fonctionne sur une connexion SSH texte uniquement et analyse exactement le dialecte regex dont j'ai besoin: mon code (C ++) est lié à libpcre, donc il n'y a aucune difficulté avec les 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 le besoin d'un débogueur regex est une odeur de code. Pour moi, le plus difficile dans l'utilisation des expressions régulières n'est généralement pas l'expression régulière elle-même, mais les multiples couches de citations nécessaires pour les faire fonctionner.





0

Pour moi, après avoir regardé le regex (comme je suis assez courant, et j'utilise presque toujours / x ou équivalent), je pourrais déboguer plutôt que tester si je ne suis pas sûr que j'atteindrais une correspondance dégénérée (c'est-à-dire quelque chose qui revient excessivement en arrière) pour voir si je pourrais 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 rationnelles C #.

(L'astuce perl est nouvelle pour moi, donc je l'ajouterai probablement aussi à ma boîte à outils regex.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.