In jeder Programmiersprache, mit der ich gearbeitet habe, ist die Unterstützung für reguläre Ausdrücke (falls vorhanden) grundsätzlich eine schwarze Box: Es gibt einige Funktionen wie match
, scan
usw., die einen Ausdruck annehmen und etwas - oft eine Zeichenkette oder ein Array - aber sie berichten nicht darüber, was sie tun , während sie es tun .
Ich frage mich, ob es in irgendeiner einigermaßen populären Programmiersprache entweder eingebaute oder Bibliotheks-Unterstützung für die Anpassung regulärer Ausdrücke gibt und irgendeine Art von Echtzeit-Ausgabe (z. B. zu Standardausgabe) liefert, die anzeigt, was passiert / p>
Update : Ich schätze die Kommentare bisher; Ich frage jedoch nicht nach einem Werkzeug, das die Struktur des regulären Ausdrucks selbst anzeigt , was debuggex.com ist und regexper.com scheinen das zu tun (obwohl das sehr cool ist!). Ich wollte fragen, ob ich während des Teils, wo der Ausdruck auf eine Eingabe angewendet wird, Informationen zur Verfügung stelle.
Hier ist ein hypothetisches Beispiel: Angenommen, ich hätte den Ausdruck "(foo | bar | baz)" und ich teste dies gegen die Zeichenfolge "baz"; dann stelle ich mir eine Ausgabe vor, die wie folgt aussehen könnte ...
%Vor%Offensichtlich würde es nicht ganz so aussehen; aber Sie bekommen die Idee.
Mehrere Bibliotheken für reguläre Ausdrücke sind so geschrieben, dass Sie Informationen über den Status nach Status erhalten können. Insbesondere schrieb Russ Cox einen Artikel über reguläre Ausdrücke, der Code-Bits und eine API für den Übergang von Staat zu Staat enthielt:
Der in diesem Artikel verwendete Code wurde zu einer vollständigen, einfachen Regex-Bibliothek erweitert, die eine Schritt-für-Schritt-Ausgabe zu geben scheint, ähnlich wie beschrieben:
Später wurde der Code vollständiger ausgearbeitet und ist nun eine vollständige Regex-Bibliothek, die von Google gepflegt (und intern verwendet) wird:
BEARBEITEN
Wenn Sie re2 mit DebugDFA
im Quelltext auf true kompilieren, erhalten Sie während der Verarbeitung eine state-by-state-Ausgabe. Für viele Regex-Ausdrücke entspricht es jedoch möglicherweise nicht dem tatsächlichen regulären Ausdruck 1-1, und die Ausgabe ist etwas esoterisch.
Pythons Engine für reguläre Ausdrücke bietet Sichtbarkeit mit dem RE.debug-Flag . Du verlangst etwas anderes (Echtzeit-Feedback), von dem ich mir sicher bin, dass es es nicht gibt. Ich konnte sehen, dass es in eine IDE oder eine erweiterte Python-Shell wie ipython integriert wurde. Es wäre eine lustige Sache zu schreiben und meiner Meinung nach sehr nützlich.
Obwohl es keine Programmiersprache ist, verfügt das JGSoft-Dienstprogramm RegexBuddy über einen eingebauten Debugger für reguläre Ausdrücke, der jeden Schritt (einschließlich jede Rückverfolgung), die die Regex-Engine ausführt, wenn sie auf eine gegebene Zielzeichenfolge angewendet wird. Ich benutze dieses Werkzeug, um die Effizienz verschiedener Ausdrücke zu messen und zu vergleichen. Es ist auch ziemlich praktisch für die Identifizierung von Runaway-Ausdrücke (d. H. katastrophale Backtracking ).
Dies ist keine exakte Antwort auf das, was Sie fragen, ist aber verwandt.
Wenn Sie während der Auswertung eines Strings eine willkürliche Berechnung mit Callbacks durchführen möchten (wie es ein Compiler tun könnte, um beim Syntaxen des Quellcodes einen abstrakten Syntaxbaum zu generieren), können Sie die Syntaxanalyse- und Lexing-Tools verwenden fast jede populäre Sprache. Viele von ihnen verwenden reguläre Ausdrücke, um die Grammatiken zu definieren, die sie akzeptieren werden, und sie sind geeigneter für die Verarbeitung komplexer Grammatiken (allerdings ist das für das Beispiel, das Sie angegeben haben, eindeutig zu viel Aufwand).
Tags und Links regex