ich bin heute auf den Regex-Tester von cdr aufmerksam geworden und habe das zum Anlass genommen, einen eigenen verbesserten Regex-Tester zu schreiben, der mehr auf das experimentelle Erstellen von Regex abhebt. Deshalb habe ich das Programm Regex-Lab genannt.
Regex-Lab arbeitet on the fly. Das bedeutet, dass bei jeder Änderung des Pattern, des Input-Textes oder der Optionen/Einstellungen, die Auswirkungen sofort angezeigt werden.
Dabei wird der gefundene Text unterstrichen und die gefundenen Gruppen werden im InputText und in der Group-Liste farblich hervorgehoben. Man sieht also genau, von wo bis wo der Pattern und seine Teile (Groups) gematcht haben. Wenn eine Gruppe mehr als einen Capture hat, werden die Captures in der Farbe der Gruppe, aber mit wechselnder Helligkeit ausgegeben, so dass man auch hier sehen kann, von wo bis wo sich der Capture im Input-Text erstreckt.
Ich habe zwei Screenshots angehängt, durch die das deutlicher wird.
Version 0.02 (05.07.2006)
Verbesserungen:
Es gibt jetzt ein NumericUpDown-Feld zur Auswahl, der wievielte Match gefunden und angezeigt werden soll. Das ist quasi die on-the-fly-Version eines FindNext-Buttons.
Dieses NumericUpDown-Feld wird zur Erinnerung gelb eingefärbt, sobald ein anderer Wert als 1 eingestellt ist. Es wird rot, wenn nur deshalb kein Match gefunden wird, weil der eingestellte Wert zu hoch ist.
Erfolgt ein Match, wird der Cursor auf den Beginn des Matches gesetzt.
Wenn man eine Gruppe oder einen Capture auswählt, wird der Cursor auf den Beginn der gewählten Gruppe oder des gewählten Captures gesetzt.
Befindet sich die Cursorposition in einem der drei genannten Fälle außerhalb sichtbaren Bereichs, wird die Textbox so gescrollt, dass die Cursorposition in den sichtbaren Bereich kommt.
Die Option IgnoreCase ist voreingestellt.
Beim Eintragen der gefundenen Textstellen in die ListViews werden Whitespaces durch die Escapesequenzen ersetzt. Für einen Zeilenvorschub wird jetzt also \n angezeigt.
Die Anwendung startet mit leeren Feldern (statt mit Beispieltext und -pattern).
Die Tabstops sind jetzt etwas praktischer gesetzt.
Der Quelltext ist in der Zip-Datei enthalten.
Bekannte Einschränkungen:
Das Matchen geht normalerweise in Sekundenbruchteilen und wird daher im GUI-Thread ausgeführt. Wenn Pattern mit massivem Backtracking auf lange Input-Texte angewendet werden, kann es sein, dass die Anwendung für längere Zeit (bis eben der Match abgearbeitet wurde) nicht reagiert. Wird vermutlich in der Praxis nur äußerst selten vorkommen.
Tipps:
Beim Übernehmen des fertigen Pattern in den Programmcode muss man darauf achten, ...
dass die Flags (RegexOptions) im Code genauso gesetzt sind wie in Regex-Lab und
PS: Fehler und Ungereimtheiten sind natürlich nicht ausgeschlossen. Für entsprechende Hinweise bin ich dankbar.
Stichworte: regexlab, regextester (bei Erscheinen von Version 0.06 war Version 0.02 596 mal heruntergeladen)
In einem anderen Beitrag weiter unten ist die neue Version 0.06 mit einigen kleinen Verbesserungen verfügbar. Ich empfehle diese neue Version herunterzuladen.
das Tool kommt genau richtig, muss nämlich grad einen regulären Ausdruck auf Funktionalität mit viel und verschiedenem content testen.
Das Programm gefällt mir richtig gut, gerade durch das hervorheben der verschiedenen Elemente! Bisher auch kein Bug gefunden - werde ich wahrscheinlich auch nicht
in gewissem Sinne ist das Programm ja gerade ein Wysiwyg-Editor. Du tippst was ein und siehst sofort, was du bekommst.
Oder meinst du, dass man irgendwo z.B. "eine Ziffer" auswählen kann und er schreibt dann [0-9] bzw. \d in das Pattern-Feld? Das ist m.E. ein Job für die (übrigens auch in dieser Hinsicht sehr gute) SDK-/MSDN-Dokumentation. Und da ein solcher Modus schnell an seine Grenzen stößt, möchte ich damit gar nicht erst anfangen. Aber ich habe schon überlegt, eine F1 Übersichtshilfe einzubauen.
herbivore
Nachtrag: In der der Version 0.06 weiter unten ist die Übersichtshilfe eingebaut. Sie ist - wie gesagt - durch Drücken der F1-Taste zu erreichen. Hier ein Screenshot:
Ich dachte an so eine Toolbox, wo verschiedene Bausteine abgelegt sind (a lá VS). Eventuel sogar mit Option, selbst solche Bausteine zu definieren. Einige Bausteione können vielleicht als Container für andere dienen u.s.w. Diese Bausteine werden nacheinander auf das "Design-Feld" gezogen, ausgewählt, oder was auch imer gemacht, daraus wird ein Pattern generiert und mit deinem Programm gleich getestet.
mir ist schon klar, dass so ein Designer schnell an seine Grenzen stoßen kann...
gruß
Xqgene
"A programmer is a tool which converts coffein to code."
Einerseits ist es leicht, weil man ja nur Regex.Match durch Regex.Matches ersetzen müsste und den einen Match durch ein Match-Array. An allen Stellen, wo der Match verwendet wird, müsste man je nachdem alle oder das gewählte Match-Array-Element verwenden.
Andererseits wäre die Frage, wie die unterschiedlichen Matches unterschieden werden können, denn sie können ja wie die Gruppen und Captures auch nahtlos aneinanderstoßen. Mal abgesehen davon, dass ein Match selbst momentan "nur" unterstrichen wird, sind Farbton und Helligkeit zur Kennzeichnung schon "verbraucht".
Außerdem bräuchte man der Konsistenz wegen dann auch noch ein weiteres ListView für alle Matches und das scheint mir etwas überladen.
Wenn ich so ein Häkchen in die "offizielle" Version einbaue, würde ich es gerne konsistent und schön machen. Und einen solchen Weg sehe ich momentan nicht. Da aber der Quellcode beiliegt, wäre es für dich sicher relativ einfach, so ein Häkchen quick'n'dirty einzubauen.
Vielleicht noch der Hinweis, dass man mit dem NumericUpDown-Feld für die Nummer des Matches sehr schnell durch die einzelnen Matches laufen kann.
hey coole Sache! ist echt nicht schlecht, kannst dir ja mal überlegen das in den Softwarelinks von Wikipedia zu posten, denn da ist imho nichts wirklich tolles dabei.
als Regex-Lab heute wieder einmal gelobt wurde (vielen Dank), hat mich das motiviert eine neue Version zur Verfügung zu stellen.
Version 0.06 (20.08.2007)
Es gibt folgende kleine Verbesserungen (gegenüber Version 0.02):
Einfache Hilfe zu regulären Ausdrücken (aufzurufen über F1)
Zusätzliche Verwendung von grauer Hinterlegung für den gesamten Match (bisher wurde nur unterstrichen)
Standard-Kontext-Menü jetzt für alle Eingabefelder
Ctrl-A (alles markieren) funktioniert jetzt in allen Eingabefeldern
Die Hilfe ist eine einfache HTML-Datei. Dabei gibt es folgende Besonderheit: Die HTML-Datei ist einerseits in Regex-Lab einkompiliert und liegt andererseits als separate Datei bei. Die separate Datei wird also nicht benötigt; die Exe alleine reicht. Wenn aber die Datei regexlab.html im Anwendungsverzeichnis von Regex-Lab vorhanden ist, wird stattdessen diese geladen. So hat jeder die Möglichkeit, die Hilfe anzupassen und die für ihn wichtigen Punkte einzutragen oder die Beschreibungen zu ändern oder zu ergänzen.
Wegen der farblichen Gestaltung der Hilfe habe ich lange mit mir gerungen. Einerseits bin ich ja eigentlich ein Fan von schlichten Layouts. Anderseits bot sich natürlich an, die Farben, die Regex-Lab verwendet, in der Hilfe wieder aufzugreifen. Das habe ich letztlich auch getan. Wer die Hilfe weniger bunt haben will, kann jedenfalls auch das leicht realisieren.
Wer die Hilfe verbessert, kann gerne seine Version der regexlab.html hier anhängen.
herbivore
PS: Fehler und Ungereimtheiten sind natürlich nicht ausgeschlossen. Für entsprechende Hinweise bin ich dankbar.
PPS: Die Version ist von 2007, aber trotzdem aktuell. Sie ist naturgemäß für ein damals verfügbares Framework kompiliert. Sollte sie auf aktuellen Rechnern nicht laufen, kann man sich leicht eine Version für das aktuelle/gewünschte Framework compilierten, da der Quellcode enthalten ist (damit die Umlaute stimmen, muss man den Compiler anweisen, die Codepage 850 zu verwenden: /codepage:850)
nur ein makel... ich kann maximal 999 zeilen machen danch muss ich die bis dahin durchgetesteten rauslöschen und dan gehts erst weiter^^ ist aber nicht besonders schlimm
(bin gerade dabei alle relvanten zeilen auf etwaige abweichung hin zu überprüfen ~ 2500 zeilen) mustes also nicht ändern da sowas ehr die ausnahme ist was ich gerade mache
die Begrenzung ist Absicht. Ich hatte sie mit 999 m.E. schon mehr als großzügig gewählt. Da der Quellcode verfügbar ist, kannst du die Begrenzung natürlich selbst aufheben.
vll könntest du noch folgende sachen implementieren
[:alnum:warn: Alphanumerische Zeichen: [:alpha:warn: und [:digit:warn:.
[:alpha:warn: Buchstaben: [:lower:warn: und [:upper:warn:.
[:blank:warn: Leerzeichen und Tabulator.
[:cntrl:warn: Steuerzeichen. Im ASCII sind das die Zeichen 00 bis 1F, und 7F (DEL).
[:digit:warn: Ziffern: 0, 1, 2,... bis 9.
[:graph:warn: Graphische Zeichen: [:alnum:warn: und [:punct:warn:.
[:lower:warn: Kleinbuchstaben1: nicht notwendigerweise nur von a bis z.
[:print:warn: Druckbare Zeichen: [:alnum:warn:, [:punct:warn: und Leerzeichen.
[:punct:warn: Zeichen wie: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ .
[:space:warn: Whitespace: Horizontaler und vertikaler Tabulator, Zeilen- und Seitenvorschub, Wagenrücklauf und Leerzeichen.
[:upper:warn: Großbuchstaben1: nicht notwendigerweise nur von A bis Z.
[:xdigit:warn: Hexadezimale Ziffern: 0 bis 9, A bis F, a bis f.
das Regex-Lab soll ja hinsichtlich der Patternsyntax genau den Funktionsumfang von .NET haben. Daher ist es nicht sinnvoll, die Patternsyntax zu erweitern, denn es wäre ja unpraktisch, wenn man mit den Regex-Lab einen Pattern austüftelt könnte, der dann mit .NET gar nicht funktionieren würde.
Auch von mir mal ein Dankeschön an herbivore für dieses äußerst hilfreiche Tool. Hab's gerade zufällig beim stöbern im Forum entdeckt. Endlich kann man mal reg. Ausdrücke schnell testen.
- Kann man nicht was dranmachen, daß man erfolgreiche Tests, also einen bestimmten Input und ein Pattern, zusammen mit einer Bemerkung abspeichert? Manches braucht man doch mehrmals, oder Abwandlungen davon.