Deutsch
Quelltexte/ Codesnippets

Regex Tester Umformer

 

Michael
Wodrich
Bei den regulären Ausdrücken kam mir die Idee eines eigenen Testprogrammes.

Außerdem wollte ich RexEx-Ausdrücke mit Backslash automatisch umwandeln lassen. Meine Versuche anbei. Der Backslash mit nachfolgendem doppelten Anführungszeichen muß aber von Hand in Backslash+q umgewandelt werden.

Außerdem müßen hierfür die Escapezeichen ausgeschaltet werden, da ich sonst die doppelten Backslashes ja nicht wiederfinde...

Der Umwandler schlägt automatisch zu, wenn nichts gefunden wurde - aber nur ein Anzeigevergleich.

Die Ergebnisse werden in den Editor geladen, der sich bei *.TXT für zuständig hält (ShellExec).
!
RegEx_Tester
ab XProfan 10
Set("Escape",0)
Declare CR$, Qu$
CR$ = Chr$(13) + Chr$(10)  Zeilenende
Qu$ = Chr$(34)  Doppelte Anführungszeichen
==========  Suchmuster und Beispiele  ==========
Declare Datei_Muster$, Datei_Test$
Datei_Muster$ = "(?mi)^[^~./:~*~?q<>~|]{1}[^/:~*~?q<>~|]{0,254}$"
Datei_Test$ = "abcd.jpg" + CR$ +
"a b239.abcd ef12983 298" + CR$ +
"a....23498" + CR$ +
".abcde.jpg" + CR$ +
"abcde?.jpg" + CR$ +
"c:\abcde.jpg" + CR$
Declare eMail_Muster$, eMail_Test$
eMail_Muster$ = "(?mi)^([a-zA-Z~d]+([-~.~w]*[a-zA-Z~d])*@([a-zA-Z~d][-~w]*[a-zA-Z~d]~.)+[a-zA-Z]{2,9})$"
eMail_Test$ = "joe@aol.com" + CR$ +
"ssmith@aspalliance.com" + CR$ +
"a@b.cc" + CR$ +
"joe@wrox.co.uk" + CR$ +
"joe@domain.info" + CR$ +
"e@eee.com" + CR$ +
"eee@e-e.com" + CR$ +
"eee@ee.eee.museum" + CR$ +
".@eee.com" + CR$ +
"@eee.com" + CR$ +
"eee@e-.com" + CR$ +
"eee@ee.eee.eeeeeeeeee" + CR$ +
"a@b" + CR$ +
"notanemail" + CR$ +
"joe@@." + CR$ +
"joe@123aspx.com" + CR$ +
"joe@web.info" + CR$ +
"joe@company.co.uk" + CR$
Declare Money_Muster$, Money_Test$
Money_Muster$ = "(?m)^(~x80|~x24|~xA3|~xA5|~x20AC|~x0024|~x00A3|~x00A5)?(([1-9]~d{0,2}(~,~d{3})*)|([1-9]~d*)|(0))(~.~d{2})?$"
Money_Test$ = "$1,234,567.89" + CR$ +
"1234567.89" + CR$ +
"1,234,567.89" + CR$ +
"$0.00" + CR$ +
"$1,2345,67.89" + CR$ +
"$1234,345,678.0" + CR$ +
"£1.25" + CR$ +
"¥15000" + CR$ +
"€4.37"  ja, das liebe Euro-Zeichen...
Declare Tel_Muster$, Tel_Test$
Tel_Muster$ = "(~+~d *)?(~(~d+~) *)?~d+(-~d*)*"
Tel_Test$ = "Phone of AlkorSoft (project PayCash) is +7(812) 329-44-69"
Declare Url_Muster$, Url_Test$
Url_Muster$ =	"(?i)" +   ignoriere Groß/Klein
"((FTP|HTTPS|HTTP)://|www~.)" +   Protokoll (ohne: www.)
"([~w~d~-]+:[~w~d~-]+@)?" +   User / Passwort
"([^/~r~n:]+)" +   TCP Adresse oder Domainname
"(:~d{1,5})?" +   Portnummer
"(((/[%+~w~d~-~.]*)+)*)" +   Unix-Pfad
"(~?[^~s=&]+=[^~s=&]+(&[^~s=&]+=[^~s=&]+)*)?" +   Abfrage- (GET) Parameter
"(#[~w~d~-%+]+)?"  HTML-Anker (Bookmark)
Url_Test$ = "https://192.168.0.2:80/users/~fname.lname/file.ext" + CR$ +
"ftp://user1:pwd@www.domain.com" + CR$ +
"ftp://download-store@www.domain.com" + CR$ +
"ftp://download-store.com/the_file.zip" + CR$ +
"https://www.dom" + CR$ +
"www.domain.com" + CR$ +
"user1:pwd@domain.com" + CR$ +
"192.168.0.2/folder/file.ext" + CR$ +
"https://192.168.0.2/folder/file.ext" + CR$ +
"https://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/reconbackreferences.asp" + CR$ +
"https://www.domain.com/folder" + CR$ +
"https://www.domain.com/folder/" + CR$
==========  Prozeduren  ==========

Proc RegEx_Umformer

    Bitte beachten: der Umformer funktioniert nur, wenn die Escapezeichen ausgeschaltet sind !!!
    Auch der reguläre Ausdruck muß mit Set("Escape",0) erfaßt worden sein.
    Sonderfall: Doppelte Anführungszeichen im String ersetzt man per Hand in q, das
    wird dann hier wieder geändert.
    RegEx-Escapezeichen:
    xnn     Zeichen mit dem Hex-Code nn (ASCII-Text)
    x{nnnn} Zeichen mit dem Hex-Code nnnn (ein Byte für ASCII-Text und zwei Bytes für Unicode-Zeichen
    ein Tabulator (HT/TAB), gleichbedeutend wie x09
    Zeilenvorschub (NL), gleichbedeutend wie x0a
    Wagenrücklauf (CR), gleichbedeutend wie x0d
    f       Seitenvorschub (FF), gleichbedeutend wie x0c
    a       Alarm (bell) (BEL), gleichbedeutend wie x07
    e       Escape (ESC), gleichbedeutend wie x1b
    \       Backslash selbst (behandelt der Umformer)
    q       XProfan: Doppelte Anführungszeichen (behandelt der Umformer)
    vordefinierte Klassen:
    w       ein alphanumerisches Zeichen inklusive "_"
    W       kein alphanumerisches Zeichen, auch kein "_"
    d       ein numerisches Zeichen
    D       kein numerisches Zeichen
    s       irgendein wörtertrennendes Zeichen (entspricht [
    f])
    S       kein wörtertrennendes Zeichen
    Wortgrenzen:
           findet eine Wortgrenze (wo w an W grenzt)
    B       findet alles ausser einer Wortgrenze
    Modifikatoren:
    (?i)     Führe die Suche Schreibweisen-unabhägig durch
    (?m)     Behandle den Zielstring als mehrzeiligen String. Das bedeutet, ändere
    die Bedeutungen von "^" und "$": Statt nur den Anfang oder das Ende des
    Zielstrings zu finden, wird jeder Zeilenseparator innerhalb eines Strings
    erkannt (beachte auch die Zeilenseparatoren)
    (?s)     Behandle den Zielstring als einzelne Zeile. Das bedeutet, dass "." jedes
    beliebige Zeichen findet, sogar Zeilenseparatoren, die es normalerweise nicht findet.
    (?g)     Modifikator für den "Genügsam"-Modus. Durch das Ausstellen werden alle folgenden
    Operatoren in den "Genügsam"-Modus geschaltet. Standardmassig sind alle Operatoren
    "gierig". Wenn also der Modifikator (?-g) aus ist, dann arbeitet + wie +?, * als *? etc.
    Kommentar:
    (?#text) "text" ist Kommentar (darf keine schliessende Klammer beinhalten).
    Parameters in$
    Declare out$, i%
    out$ = Translate$(in$,"\",Chr$(250))  räume alle Doppel-Backslashes aus dem Weg
    out$ = Translate$(out$,"q",Chr$(34))  Sonderfall doppelte Anführungszeichen
    out$ = Translate$(out$,"","~")  ändere das Escapezeichen
    out$ = Translate$(out$,Chr$(250),"")  stelle den gewünschten Backslash wieder her
    out$ = Translate$(out$,"[a-zA-Z0-9]","[a-zA-Z~d]")
    out$ = Translate$(out$,"[0-9a-zA-Z]","[a-zA-Z~d]")
    out$ = Translate$(out$,"[a-zA-Z0-9_]","[~w]")
    out$ = Translate$(out$,"[_0-9a-zA-Z]","[~w]")
    out$ = Translate$(out$,"[0-9]","[~d]")
    out$ = Translate$(out$,"[^a-zA-Z0-9]","[^a-zA-Z~d]")
    out$ = Translate$(out$,"[^0-9a-zA-Z]","[^a-zA-Z~d]")
    out$ = Translate$(out$,"[^a-zA-Z0-9_]","[~W]")
    out$ = Translate$(out$,"[^_0-9a-zA-Z]","[~W]")
    out$ = Translate$(out$,"[^0-9]","[~D]")
    Return out$

EndProc

Proc ZeigMal

    Parameters Text$
    Declare f$, hF&, B#
    f$ = $TempDir + "TEMP_RegEx_Tester.txt"
    Dim B#,Len(Text$)+1
    String B#,0 = Text$
    BlockWrite f$,B#,0,Len(Text$)    Erstelle temp. Datei...
    Dispose B#
    ShellExec(f$,"open",1)           zeige sie an...

    Repeat

        hF& = FindWindow( "TEMP_RegEx_Tester" )   warte bis das Fenster da ist...

    Until hF& <> 0

    Erase f$   und entferne die Datei wieder. Mit dem Editor kann das Ergebnis trotzdem gesichert werden.

EndProc

Proc RegEx_Tester

    Parameters RegEx$, Text$
    Declare Erg$, s$, RestText$, Offset&, oldDeci%, Index%
    oldDeci% = Set("Decimals",0)
    Offset& = 1
    RestText$ = Text$

    If Len(Text$) < 80

        Erg$ = "Suchtext: " + Qu$ + Text$ + Qu$ + CR$
        Erg$ = Erg$ + Space$(11) +
        If(Len(Text$) >= 10,
        MkStr$("1234567890",Len(Text$)  10) + Left$("1234567890",Len(Text$) mod 10),
        Left$("1234567890",Len(Text$) mod 10)) + CR$ + CR$

    Else

        Erg$ = "Suchtext:" + CR$ + Text$ + CR$ + CR$

    EndIf

    Erg$ = Erg$ + "regulärer Ausdruck:" + CR$ + RegEx$ + CR$ + CR$
    Erg$ = Erg$ + "Ergebnis:" + CR$
    s$ = Match$(RegEx$,RestText$)

    While s$ <> ""

        Inc Index%
        Erg$ = Erg$ + "Match " + Str$(Index%) + ": " + Qu$ + s$ + Qu$ +
        ", Len: " + Str$(%MatchLen) +
        ", Pos: " + Str$(%MatchPos) +
        ", GesamtPos: " + Str$(Offset& + %MatchPos - 1) + CR$
        Offset& = Offset& + %MatchPos + %MatchLen - 1
        RestText$ = Mid$(Text$,Offset&,Len(Text$))
        s$ = Match$(RegEx$,RestText$)

    EndWhile

    IfNot Index%

        Erg$ = Erg$ + "*** keine Treffer ***" + CR$ + CR$
        Erg$ = Erg$ + "Wurden vielleicht die Escapezeichen nicht angepaßt? Hier eine Gegenüberstellung." + CR$
        Erg$ = Erg$ + "alt: " + Qu$ + RegEx$ + Qu$ + CR$
        Erg$ = Erg$ + "neu: " + Qu$ + RegEx_Umformer( RegEx$ ) + Qu$ + CR$

    EndIf

    Set("Decimals",oldDeci%)
    Return Erg$

EndProc

==========  Hauptprogramm  ==========
ZeigMal RegEx_Tester( "(?i)[e]+","Proc RegEx_Tester" )
ZeigMal RegEx_Tester( "(w+)?","Proc RegEx_Tester" )  zum Testen
ZeigMal RegEx_Tester( Datei_Muster$, Datei_Test$ )
ZeigMal RegEx_Tester( eMail_Muster$, eMail_Test$ )
ZeigMal RegEx_Tester( Money_Muster$, Money_Test$ )
ZeigMal RegEx_Tester( Tel_Muster$, Tel_Test$ )
ZeigMal RegEx_Tester( Url_Muster$, Url_Test$ )
Set("Escape",1)
End

Schöne Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
17.06.2006  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

4.746 Betrachtungen

Unbenanntvor 0 min.
H.Brill17.11.2023
RudiB.26.04.2022
Jörg Sellmeyer15.05.2018
Alibre01.05.2018
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

Michael Wodrich (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie