  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 |  
  |