Wie debuggt man eine Regex? [geschlossen]

149

Reguläre Ausdrücke können sehr komplex werden. Der Mangel an Leerraum macht sie schwer lesbar. Ich kann mit einem Debugger nicht durch einen regulären Ausdruck treten. Wie debuggen Experten komplexe reguläre Ausdrücke?

Turm
quelle
2
Ich glaube, dass das "Testen" Ihres regulären Ausdrucks viel wichtiger ist als das "Debuggen". Normalerweise können Sie leicht herausfinden, was mit einer Regex los ist, indem Sie das Ergebnis betrachten (oder eines der in den Antworten vorgeschlagenen Tools verwenden). Um jedoch wirklich sicher zu sein, dass es das tut, was Sie meinen, sollten Sie Ihre Regex mit allen möglichen Grenzfällen testen. Das Testen wird schließlich klarstellen, was Sie wirklich tun möchten, und das Debuggen unbrauchbar machen :)
baol
7
Dies scheint interessant zu sein: http://www.debuggex.com/ (Da die Frage geschlossen ist, kann ich keine echte Antwort hinzufügen.)
KajMagnus
Wenn Sie über Visual Studio verfügen, können Sie einen Haltepunkt in der Nähe Ihres Problembereichs festlegen (z. B.: RegEx.Replace(...)'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
Wechseln Sie zu "Sofortfenster
2
Ich bin sehr überrascht, dass niemand regex101.com erwähnt hat, das einen tatsächlichen Debugger hat und auch im Internet gehostet wird.
Mechalynx
1
Selbst im Jahr 2017 glaube ich, dass Regexbuddy immer noch das beste Werkzeug ist, das ich finden kann, und der Preis bleibt bei 40 USD. Ich arbeite oft in verschiedenen Sprachen mit unterschiedlichem Regex-Geschmack, daher bin ich oft verwirrt. Mit regexbuddy befreit es mich nur von der Syntax
code4j

Antworten:

68

Sie kaufen RegexBuddy und verwenden die integrierte Debug-Funktion . Wenn Sie mehr als zweimal im Jahr mit regulären Ausdrücken arbeiten, verdienen Sie dieses Geld in kürzester Zeit zurück. RegexBuddy hilft Ihnen auch dabei, einfache und komplexe reguläre Ausdrücke zu erstellen und sogar den Code für Sie in einer Vielzahl von Sprachen zu generieren.

Alt-Text

Laut Entwickler läuft dieses Tool unter Linux nahezu einwandfrei, wenn es mit WINE verwendet wird .

Mick
quelle
31
Schade, dass es nur für Windows ist und 40 US-Dollar kostet.
Kennytm
25
Laut Entwickler läuft es unter Linux über WINE: regexbuddy.com/wine.html . Und über die 40-Dollar-Kosten ... wie viel ist Ihre Zeit wert?
Mick
18
Dies ist keine freie Software.
Codeholic
38
Wer hat das gesagt oder darum gebeten?
Tim Pietzcker
21
Nun, wie Mick sagte, wie viel ist deine Zeit wert? "Die besten Werkzeuge, die man für Geld kaufen kann" müssen nicht immer Geld kosten, aber manchmal auch. Darüber hinaus entwickelt JGSoft konsequent große Qualitätsprodukte mit außergewöhnlichem Benutzerservice. Ich habe sogar Software von ihnen gekauft, die ich nicht wirklich brauche (wie RegexMagic), weil ich sie unterstützen und im Geschäft halten möchte. Sie wissen nicht, was Sie vermissen. Ernsthaft.
Tim Pietzcker
52

Mit Perl 5.10 , use re 'debug';. (Oder debugcolor, aber ich kann die Ausgabe bei Stapelüberlauf nicht richtig formatieren.)

$ perl -Mre = debug -e '"foobar" = ~ / (.) \ 1 /'
Kompilieren von REx "(.) \ 1"
Abschlussprogramm:
   1: OPEN1 (3)
   3: REG_ANY (4)
   4: CLOSE1 (6)
   6: REF1 (8)
   8: ENDE (0)
minlen 1
Matching REx "(.) \ 1" gegen "foobar"
   0 <> <foobar> | 1: OPEN1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: CLOSE1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  gescheitert...
   1 <f> <oobar> | 1: OPEN1 (3)
   1 <f> <oobar> | 3: REG_ANY (4)
   2 <fo> <obar> | 4: CLOSE1 (6)
   2 <fo> <obar> | 6: REF1 (8)
   3 <foo> <bar> | 8: ENDE (0)
Match erfolgreich!
REx freigeben: "(.) \ 1"

Auch Sie können Leerzeichen und Kommentare zu Regexes hinzufügen , um sie besser lesbar zu machen. In Perl erfolgt dies mit dem /xModifikator. Mit pcregibt es die PCRE_EXTENDEDFlagge.

"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", ...);
kurzlebig
quelle
12
+1: Warum sollte jemand Regexbuddy diesem vorziehen?
Charles Stewart
1
Ich mag diese Methode, obwohl ich denke, dass Regex Buddy besser ist.
Turm
echo "foobar" | egrep "(.) \ 1"
DmitrySandalov
30

Ich werde ein weiteres hinzufügen, damit ich es nicht vergesse: debuggex

Es ist gut, weil es sehr visuell ist: Foto des Debuggex-Regex-Helfers

Kevin
quelle
debuggex funktioniert bei mir eigentlich nicht: Die Schriftarten werden anscheinend von JavaScript erzwungen und funktionieren nicht (ich habe monospaced Schriftarten, die Firefox-Konsole verwendet sie perfekt). Infolgedessen ist die Anzeige unbrauchbar. Darüber hinaus hängt der JavaScript-Test den Browser mit vielen Testfällen für jede Edition (nicht nur einmal beim Auslösen). Schließlich sind einige der vorgeschlagenen regulären Ausdrücke fehlerhaft und stimmen nicht wie beabsichtigt überein.
7heo.tk
28

Wenn ich auf einem regulären Ausdruck stecke, wende ich mich normalerweise diesem zu: https://regexr.com/

Es ist perfekt, um schnell zu testen, wo etwas schief geht.

Thetaiko
quelle
1
Dieses Tool ist wirklich nützlich: Es wird im Internet gehostet, ist also keine Installation, es ist Echtzeit, also ist das Debuggen ein Traum, und es enthält sogar nützliche Tooltips und eine Liste von Sonderzeichen, falls Sie sich an etwas nicht erinnern können. Es ist perfekt, vielen Dank
Jason Ridge
Leider können Sie mit diesem Tool (noch) die Regex-Trennzeichen nicht ändern (auch nicht für die PCRE-Engine) - sie sind als /(Schrägstriche) festgelegt. Dies ist ein Showstopper für mich.
MrWhite
19

Ich verwende Kodos - den Python-Debugger für reguläre Ausdrücke:

Kodos ist ein Python-GUI-Dienstprogramm zum Erstellen, Testen und Debuggen regulärer Ausdrücke für die Programmiersprache Python. Kodos sollte jedem Entwickler helfen, reguläre Ausdrücke in Python effizient und mühelos zu entwickeln. Da Pythons Implementierung regulärer Ausdrücke auf dem PCRE- Standard basiert , sollte Kodos Entwicklern in anderen Programmiersprachen zugute kommen, die ebenfalls den PCRE-Standard einhalten (Perl, PHP usw.).

(...)

Alt-Text

Läuft unter Linux, Unix, Windows, Mac.

Pascal Thivent
quelle
2
Kodos bietet keine echten Debugging-Funktionen. Sie können weder den regulären Ausdruck ändern noch die Ausführung anhalten.
Candide
Irgendwelche Tipps, wie man es auf einem Mac zum Laufen bringt? Die Sourceforge-Website bietet keine Informationen zur Installation für Mac, und mein Google-Fu scheint mir zu scheitern.
Adam Parkin
Obwohl dies Python2 zu sein scheint und seit 2006 (vor 14 Jahren zum Zeitpunkt des Schreibens) nicht mehr aktualisiert wurde?
MrWhite
13

Ich denke sie tun es nicht. Wenn Ihr regulärer Ausdruck zu kompliziert und so problematisch ist, dass Sie einen Debugger benötigen, sollten Sie einen bestimmten Parser erstellen oder eine andere Methode verwenden. Es wird viel besser lesbar und wartbar sein.

Valentin Rocher
quelle
4
Alter, hast du das gepostet, nachdem du dir den Regexbuddy-Screenshot angesehen hast?
Turm
2
Jeder wird damit nicht einverstanden sein, aber es ist keine schlechte Idee. Jeder geht davon aus, dass die Regex-Engine mit enormen Regexen am effizientesten ist. Dies ist nicht unbedingt wahr und sie sind definitiv nicht leicht zu lesen. Brechen Sie Ihre Regexes auf.
Dan Rosenstark
1
@ Michael Brooks: Nein, eigentlich vorher. Nachdem ich den Screenshot gesehen habe, bin ich damit einverstanden, dass Sie einen regulären Ausdruck debuggen können. Aber ich stehe zu meiner Idee: Wenn ein regulärer Ausdruck zu kompliziert wird, ist es Zeit, auf einen anderen Weg zu wechseln.
Valentin Rocher
12

Es gibt ein ausgezeichnetes kostenloses Tool, den Regex Coach . Die neueste Version ist nur für Windows verfügbar. Sein Autor Dr. Edmund Weitz hat die Pflege der Linux-Version eingestellt, weil zu wenige Leute sie heruntergeladen haben. Auf der Download-Seite befindet sich jedoch eine ältere Version für Linux.

APC
quelle
8

Ich habe gerade eine Präsentation von Regexp :: Debugger von seinem Schöpfer gesehen: Damian Conway. Sehr beeindruckendes Material: Inplace oder mit einem Befehlszeilentool (rxrx), interaktiv oder in einer "protokollierten" Ausführungsdatei (in JSON gespeichert) ausführen, jederzeit vorwärts und rückwärts gehen, an Haltepunkten oder Ereignissen anhalten, farbige Ausgabe (vom Benutzer konfigurierbar) ), Heatmaps auf Regexp und String zur Optimierung usw ...

Kostenlos auf CPAN verfügbar: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm

Yves
quelle
OP sagte: "Ich kann mit einem Debugger nicht durch einen regulären Ausdruck treten."
Quanten
Haben Sie einen Link zur Präsentation?
Turm
3
@Rook, Sie können die Präsentation unter youtube.com/watch?v=zcSFIUiMgAs
Starfish
6

Ich debugge meine Regexes mit meinen eigenen Augen. Deshalb benutze ich den /xModifikator, schreibe Kommentare für sie und teile sie in Teile. Lesen Sie Jeffrey Friedls Mastering Regular Expressions , um zu lernen, wie Sie schnelle und lesbare reguläre Ausdrücke entwickeln. Verschiedene Regex-Debugging-Tools provozieren nur die Voodoo-Programmierung.

Codeholic
quelle
5

Normalerweise verwende ich das Dienstprogramm pcretest, mit dem der Bytecode eines beliebigen regulären Ausdrucks ausgegeben werden kann, und normalerweise ist es viel einfacher zu lesen (zumindest für mich). Beispiel:

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
------------------------------------------------------------------
dark100
quelle
3

Wenn Sie ein Mac-Benutzer sind, bin ich gerade auf diesen gestoßen:

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

Es ist kostenlos und einfach zu bedienen und es war eine große Hilfe für mich, RegExs im Allgemeinen in den Griff zu bekommen.

jayp
quelle
2

Das Schreiben von Reg-Exes mit einer Notation wie PCREs ist wie das Schreiben von Assembler: Es ist in Ordnung, wenn Sie nur die entsprechenden Automaten mit endlichen Zuständen in Ihrem Kopf sehen, aber es kann schwierig werden, sie sehr schnell zu warten.

Die Gründe für die Nichtverwendung eines Debuggers sind ähnlich wie für die Nichtverwendung eines Debuggers mit einer Programmiersprache: Sie können lokale Fehler beheben, aber sie helfen Ihnen nicht bei der Lösung der Entwurfsprobleme, die Sie dazu veranlasst haben, die lokalen Fehler in der ersten zu machen Ort.

Der reflektierendere Weg besteht darin, Datendarstellungen zu verwenden, um reguläre Ausdrücke in Ihrer Programmiersprache zu generieren, und geeignete Abstraktionen zu haben, um sie zu erstellen. Olin Shivers Einführung in seine Schema-Regexp-Notation bietet einen hervorragenden Überblick über die Probleme beim Entwerfen dieser Datendarstellungen.

Charles Stewart
quelle
Parser-Kombinatoren sind in der Tat ein großartiger Weg: Parsec und PArrows in Haskell, rsec in Ruby, Boost Spirit in C ++, PyParsing in Python, Perl6 :: Rules in Perl usw.
Ephemient
2

Ich verwende oft pcretest - kaum einen "Debugger", aber es funktioniert über eine Nur-Text-SSH-Verbindung und analysiert genau den Regex-Dialekt, den ich benötige: Mein (C ++) Code ist mit libpcre verknüpft, sodass es keine Schwierigkeiten mit subtilen Unterschieden gibt, was Magie ist und was ist nicht usw.

Im Allgemeinen stimme ich dem oben genannten Typ zu, für den die Notwendigkeit eines Regex-Debuggers ein Codegeruch ist. Für mich ist das Schwierigste bei der Verwendung von Regexes normalerweise nicht der Regex selbst, sondern die mehreren Anführungszeichen, die erforderlich sind, damit sie funktionieren.

Bernd Jendrissek
quelle
0

Nachdem ich den Regex in Augenschein genommen habe (da ich ziemlich fließend bin und fast immer / x oder ein gleichwertiges Element verwende), könnte ich eher debuggen als testen, ob ich mir nicht sicher bin, ob ich ein degeneriertes Matching treffen würde (dh etwas, das übermäßig zurückverfolgt). um zu sehen, ob ich solche Probleme lösen könnte, indem ich zum Beispiel die Gier eines Operators ändere.

Dazu würde ich eine der oben genannten Methoden verwenden: pcretest, RegexBuddy (wenn mein aktueller Arbeitsplatz es lizenziert hat) oder ähnliches, und manchmal stelle ich es in Linqpad ein, wenn ich in C # -Regexen arbeite.

(Der Perl-Trick ist neu für mich und wird wahrscheinlich auch meinem Regex-Toolkit hinzugefügt.)

ChrisF
quelle