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