Regextester - OpenSource

    • VB.NET

    Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      Regextester - OpenSource

      Programmname: Regextester

      Motivation
      Regular Expressions sind ein phänomenal mächtiges und effizientes Instrument zum Durchsuchen von Text, und zum Textersatz.
      Die Syntax von Regex-Ausdrücken ist aber überaus kryptisch, weshalb man kaum einen Regex entwickeln kann, ohne mehr oder weniger umfangreiche Tests.
      Es lohnt sich sehr, sich in Regex einzuarbeiten, beispielsweise das Tutorial von link_275 durcharbeiten (mein Upload enthält "nur" eine Referenz-Dokumentation).
      Freie Regextester gibt es viele, aber keiner erfüllte meine Ansprüche an Features (wohl der übliche Grund, sich ein Tool zu coden ;)).

      OpenSource
      Ursprünglich wollte ich das Teil im ShowRoom veröffentlichen, weiles weniger eine Veröffentlichung von Code ist (isses natürlich auch), sondern eine ziemlich ausprogrammierte, produktiv einsetzbare Anwendung.
      Und weil der ShowRoom die hier zutreffende Kategorie "Tools" hat.
      Aber der ShowRoom ist ClosedSource-Projekten vorbehalten, und so isses halt hier gelandet - ist auch ok. Hauptsache ich kann in Foren darauf verlinken, wennes um Regex geht ;).

      Das Projekt habich 2006 fertiggestellt, und nutze es seither. Meine Überarbeitung für den Upload bestand v.a. darin, aus der "Helpers.Dll" (die ich in allen meinen 2005er Projekten verwendete) alles rauszuwerfen, was speziell der Regextester nicht braucht.
      Die Dlls "Helpers" und "TreeListview" sind auf meinem damaligen Stand stehengeblieben. Heute würde ich viiieles anders machen, schon weil VB2010 erheblich bessere Möglichkeiten bietet. Aber auch kommentiert habich damals relativ mies.
      Das alles ordentlich zu überarbeiten lohnt sich aber nicht, weilich VB2005 nicht mehr nutze - und:
      "never change a running system!" ;)
      Ist allerdings ein bischen schade, denn es sind durchaus interessante Konzepte enthalten, die so natürlich schwerer zu verstehen sind - sorry Leute!

      Features/Bedienung
      • beliebig viele Samples: 'Sample' nenne ich einen Datensatz, bestehend aus:
        Sample-Name, SearchPattern, ReplacePattern, ToParse-Text, RegexOption und Kommentar
        Diese Samples werden gespeichert, und man kann sie anwählen und den Regex-Test jederzeit reproduzieren.
        Samples werden gelöscht durch Anwählen des RowHeaders der Samples-Liste, und dann [Entf] drücken.
        Zufügen eines leeren Samples, indem in die letzte leere Zeile der SampleListe ein Sample-Name eingetragen wird
      • Eine frei wählbare DatenDatei ist hinterlegt, in die die aktuelle Entwickler-Arbeit per Menü oder beim Schließen automatisch gespeichert wird. Will man die DatenDatei beim Schließen nicht überschreiben, so schließe man die App mit 'Menü-Quit-NoSave'
      • mehrzeilig entwickeln, mit eingerückten Klammer-Ebenen: Man kann den SearchPattern über mehrere Zeilen verteilen, und so die Wirkungsweise einzelner Buchstaben-Gruppen leichter verstehen. Bei Mehrzeiligkeit erfolgt eine automatische Einrückung der Klammer-Ebenen.
      • Dokumentation zur Regex-Syntax: - über den Button 'Reference'
      • Muster verdoppeln: Button 'CloneSample' kopiert das aktuelle Sample, und fügt es der Samples-Auflistung an. Ich empfehle, jedem Sample (also auch dem Klon) sofort einen aussagekräftigen Namen zu geben
      • BedienungsAnleitung: - Button 'Manual'
      • Export berücksichtigt VB-Syntax mit den doppelten Quotes: Button 'Export' öffnet den Standard-Editor des Systems, und schreibt den SearchPattern als Einzeiler hinein. In Rein-Version und in VB-Version, welche die VB-Syntax berücksichtigt, nach der ein ein Quote ["] innerhalb eines Strings verdoppelt werden muß, um den Compiler nicht zu verwirren.
        Vom Standard-Editor kann der SearchPattern in die Anwendung kopiert werden.
      • Darstellung der Matches im Treelistview: - Der TreeListview stellt sowohl die GesamtMatches als auch ihre Untergruppen dar. Wählt man eine Gruppe an, wird sowohl im SearchPattern als auch im geparsten Text die Entsprechung markiert (siehe Screenshot und Erläuterung)
      • Button 'ResetFonts' stellt die ursprünglichen Fonts der Richtextboxen wieder her, falls durch Einpasten von Richtext auch Richtext-Formatierungen übernommen wurden (Farben, Größen, etc), die bei der Textanalyse nur stören würden.
        'ResetFonts' ist also eher ein Workaround als ein Feature, weil ichs den Richtextboxen bei Copy&Paste nicht abgewöhnen kann, auch die Formatierungen des Textes zu übernehmen, wenn die Zwischenablage richtext-formatierten Text enthält


      Issues
      (Kleiner Hint: Man sieht - der Punkt "StartUp" ist inzwischen besonders hervorgehoben ;))
      • Ein untestbarer SearchPattern: Die Anwendung hat Richtextboxen eingebaut. Richtextbox codiert einen Zeilvorschub nicht mit \r\n, sondern nur mit \n. Das kann zu bösen Fehlern führen, wenn man Zeilvorschübe matchen will, die in der Produktiv-Umgebung evtl mit \r\n codiert sind. Der RegexPattern, der sowohl \r\n matcht, als auch \n , lautet: \r?\n
      • flexibles Layout: Alle Arbeitsflächen des Guis sind zwar verschiebbar, aber u.U. muß man an mehreren Splittern herumschieben, um die Aufteilung nach Wunsch hinzukriegen. Ich bin jetzt aber zu faul, das zu verbessern, zumal ich denke, eine perfekte Lsg für jeden UseCase wird sich nicht finden lassen.
      • StartUp: Der Form-Designer kann erst geöffnet werden, nachdem die Solution erstmalig erstellt wurde. Andernfalls sind die eingebundenen Dlls (die ja zunächst nur als Source vorliegen) nicht verfügbar.
      • CompilerWarnungen: RodFromGermany spricht CompilerWarnungen an
        Die meisten habe ich jetzt behoben, nur die Warnung

        Compiler schrieb:

        Die CountChars-Funktion gibt nicht für alle Codepfade einen Wert zurück. Fehlt eine Return-Anweisung?
        besteht weiter, weil sie schlicht falsch ist:

        VB.NET-Quellcode

        1. Public Shared Function CountChars(ByVal S As String, ByVal cMatch As Char) As Integer
        2. Dim I As Integer = S.IndexOf(cMatch)
        3. While I >= 0
        4. CountChars += 1
        5. I = S.IndexOf(cMatch, I + 1)
        6. End While
        7. End Function
        Eine als Integer deklarierte Funktion gibt immer einen Wert zurück, weil Integer eine Struktur ist. Wird kein Rückgabewert explizit angegeben, so returnt der Default-Wert der Struktur - 0 - und das ist genau beabsichtigt

      History/Updates
      • 5.4.11: CompilerWarnungen bearbeitet, 1 Bug behoben
      • 27.5.11: Exes für FW3.5 (VB2008) und FW4 (VB2010) zugefügt

      Anforderungen
      Programmiert ist es unter VisualStudio 2010, und zwar fürs Framework4 - Client Profile. Wer also mit VB2010 (Minimum Express Edition), entwickelt, sollte auch hiermit arbeiten können.
      Edit: Jetzt habe ich auch einen DownGrade auf 2008 beigefügt.

      Erläuterung des ScreenShots
      Ist leider schon sehr fachsimpelig, die Erläuterung, aber ich hoffe, auch die Regex-Noobs kriegen einen Schimmer von was Regex leisten kann:

      In 'ToParse' ist der Auszug eines Text-DatenFiles eingepastet. Im TreeListview ist der 2. Match geöffnet, und zeigt die 2 enthaltenen Gruppen an: die erste Gruppe enthält einen Buchstaben, (welcher im Sinn-Kontext des ToParse-Textes einen Schlüssel-Wert bedeutet), und die 2. Gruppe den Inhalt der Rechteck-Klammer.
      Da die 2. Gruppe des 2. Matches im Treelistview selektiert ist, wurde im ToParse-Text auch genau der Text markiert, aus dem dieser GruppenInhalt stammt, und im Searchpattern die dazugehörige GruppenDefinition.
      Weiters wurde der Search-Pattern kommentiert, denn diese popeligen 20 Zeichen habens schon ganz schön in sich ;).
      Beachte auch die Option 'IgnoreCase', die bewirkt, dass die erste Gruppe auch auf Großbuchstaben matcht , obwohl sie in Kleinbuchstaben formuliert ist.
      Bilder
      • Shots11.Png

        43,41 kB, 717×497, 2.453 mal angesehen
      Dateien

      Dieser Beitrag wurde bereits 18 mal editiert, zuletzt von „ErfinderDesRades“ () aus folgendem Grund: Update, Änderungen am Artikel

      Ich hab das Projekt mal downgeloadet und in VS 2010 geöffnet.
      16 Warnungen
      - diverse Funktionen geben keinen Wert zurück -> nach Sub konvertieren? / Return True
      - Name der Funktion als Rückgabewert wird nicht zu 0 initialisiert
      Ansonsten: Weiter so.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      also ich hab mir das auch mal geladen.
      Entzippt und die Datei RegexTester.vbproj in VS2008 Prof. unter Projekt öffnen geladen.

      Meldung war, dass der Designer mir nach öffnen der Form folgenden Fehler anzeigt




      Unter anderem bekomm ich generell 102 Fehlermeldung von VS angezeigt.
      Muss ich da noch was machen, dass das lauft?^^

      lg
      ScheduleLib 0.0.1.0
      Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
      Es sind 3 Projekte in der Solution drinne.
      Du darfst nicht die Projekt-Datei (Endung: .vbproj) eines einzelnen Projektes öffnen, sondern öffne die Solution-Datei (Endung: .sln):

      ...\RegexTester\RegexTester\RegexTester.sln

      Das einfachste ist im Dateibrowser ein Doppelklick drauf

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

      Hi!

      Es gibt ihn als 2008er Source und als 2010er.
      Ist das iwie problematisch, den eben zu öffnen und zu erstellen?

      Ich wunder mich über die vbParadise-Leute, wie unbefangen die downgeloadete Exes öffnen. Ein paar der Sachen im ShowRoom habichmir mal angeguckt, dann wurde mir das doch zu unheimlich, und ich kehr zu meinen Prinzipien zurück.
      Da kann ja die Registry verstellt werden oder sonstwas. Muß ja nichtmal bösartig sein - einfach aus Unverstand.

      Also ich finds aus Prinzip fairer und sicherer, Programme als Source zu veröffentlichen. Wenn ich euchn Trojaner reingestellt hab, könnters mir nachweisen - das ist eure Sicherheit, dassichs nicht tu ;)

      Außerdem könnter die Source auch sonstwie nutzen, oder Architektur- oder Design-Ideen "klauen". Ich binnich so der Fan von "geistigem Eigentum" - ich finde, die Konzepte "Geist" und "Eigentum" vertragen sich absolut nicht miteinander.
      Hi,

      ein Bug is mir noch aufgefallen. Und zwar wenn man unten bei den Groups den ColumnHeader in der Größe verschieben will gibt's eine Ausnahme: Der Wert 2 ist für ColumnHeaderHeight ungültig. ColumnHeaderHeight muss größer als oder gleich 4 sein.

      Aber das nur am Rande, falls du's bei dir ausbessern magst ;)


      Link :thumbup:
      Hello World
      ich kann den Fehler nicht reproduzieren

      edit: erledigt.
      Man kann (konnte) im TreeListView unten die Header höhenverstellen - Lol - sogar so klein, das ungültige Werte auftraten - scheint mir ein DGV-Bug, denn die Header sind ein DatagridView.
      Jedenfalls ColumnHeadersHeightSizemode.AutoSize eingestellt und gut ist.
      Hab ich allerdings nur in den 2010er-Sourcen gemacht.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

      ErfinderDesRades schrieb:

      besteht weiter, weil sie schlicht falsch ist:
      Im Studio 2019 kommt diese Warnung, wohl wegen der "alten" VB-Syntax, wo der Name einer Funktion mit deren Rückgabewert identifiziert wurde.
      Mit einer separaten Variablen kommt die Warnung nicht:

      VB.NET-Quellcode

      1. Public Shared Function CountChars(ByVal S As String, ByVal cMatch As Char) As Integer
      2. Dim retval = 0
      3. Dim I As Integer = S.IndexOf(cMatch)
      4. While I >= 0
      5. retval += 1
      6. I = S.IndexOf(cMatch, I + 1)
      7. End While
      8. Return retval
      9. End Function

      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!