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?
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.
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.)
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",...);
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.
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.).
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.
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.
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 ...
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.
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
------------------------------------------------------------------07Bra3/i ab
738Alt10/i c
12[DEde]4545Ket48End------------------------------------------------------------------
Wenn ich mich festgefahren fühle, gehe ich gerne zurück und generiere den regulären Ausdruck direkt aus einem Beispieltext mit txt2re (obwohl ich den resultierenden regulären Ausdruck normalerweise von Hand optimiere ).
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.
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.
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.)
RegEx.Replace(...)
'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
Antworten:
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.
Laut Entwickler läuft dieses Tool unter Linux nahezu einwandfrei, wenn es mit WINE verwendet wird .
quelle
Mit Perl 5.10 ,
use re 'debug';
. (Oderdebugcolor
, aber ich kann die Ausgabe bei Stapelüberlauf nicht richtig formatieren.)Auch Sie können Leerzeichen und Kommentare zu Regexes hinzufügen , um sie besser lesbar zu machen. In Perl erfolgt dies mit dem
/x
Modifikator. Mitpcre
gibt es diePCRE_EXTENDED
Flagge.quelle
Ich werde ein weiteres hinzufügen, damit ich es nicht vergesse: debuggex
Es ist gut, weil es sehr visuell ist:
quelle
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.
quelle
/
(Schrägstriche) festgelegt. Dies ist ein Showstopper für mich.Ich verwende Kodos - den Python-Debugger für reguläre Ausdrücke:
Läuft unter Linux, Unix, Windows, Mac.
quelle
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.
quelle
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.
quelle
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
quelle
Ich benutze dieses Online-Tool, um meinen regulären Ausdruck zu debuggen:
https://www.regextester.com/
Aber ja, es kann RegexBuddy nicht schlagen.
quelle
Ich debugge meine Regexes mit meinen eigenen Augen. Deshalb benutze ich den
/x
Modifikator, 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.quelle
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:
quelle
Ich benutze:
http://regexlib.com/RETester.aspx
Sie können auch Regex Hero ausprobieren (verwendet Silverlight):
http://regexhero.net/tester/
quelle
Wenn ich mich festgefahren fühle, gehe ich gerne zurück und generiere den regulären Ausdruck direkt aus einem Beispieltext mit txt2re (obwohl ich den resultierenden regulären Ausdruck normalerweise von Hand optimiere ).
quelle
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.
quelle
Schauen Sie sich die (nicht kostenlosen) Tools auf regulär-expressions.info an . Insbesondere RegexBuddy . Hier ist Jeff Atwoods Beitrag zu diesem Thema .
quelle
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.
quelle
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.
quelle
Ich benutze oft Ruby-basierte Regexp-Tester Rubular
und auch in Emacs verwenden Sie M-x Re-Builder
Firefox hat auch eine nützliche Erweiterung
quelle
Ich verwende das in ActiveState Komodo enthaltene Rx Toolkit .
quelle
Sie können dies versuchen http://www.pagecolumn.com/tool/regtest.htm
quelle
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.)
quelle