Autor
|
Thema: Jenda.Rex (1890 mal gelesen)
|
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004
|
erstellt am: 12. Mrz. 2007 10:43 <-- editieren / zitieren --> Unities abgeben:
|
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 Win7, ACA2010
|
erstellt am: 12. Mrz. 2007 21:45 <-- editieren / zitieren --> Unities abgeben: Nur für bst
Hallo Bernd, Danke erstmal, die neue Version ist ja kaum paar Tage alt! :-) Also ich hab's grade mal versucht in die Gänge zu bekommen - der erste Gang ist schonmal drin;-) Verhakelt hatte ich mich etwas mit den Looks (behind und ahead): 'Dahinter' heisst ja eigentlich v.l.n.r. gesehen 'danach, also ...(?!...) und das davor wäre ja dann (?=...)..., *brrr* total durcheinandergekommen, genau andersrum scheints zu sein. Hier mal mein Testcode - lief ganz gut:
Code:
Sub jendaTest() Const O$ = "gis" Dim s As String, patter$, i% Dim re As Object Set re = CreateObject("Jenda.Rex") s = "fischer's fritze fischte frische fische." Debug.Print re.Replace(s, "fisch(?!er's|te)", "pinguin", O) 'negativer lookahead Debug.Print re.Replace(s, "fisch(?=te)", "kill", O) 'positiver lookahead Debug.Print re.Replace(s, "(?<=fri)sche", "vole", O) 'positiver lookbehind Debug.Print re.Replace(s, "(?<!fri)sche(?=r)", "edle", O) & Chr(13) '"negativer lookbehind patter = "(.*?)(f(?!r))(.*?)" Debug.Print "$1: " & re.Replace(s, patter, "$1", O) & " <---> " & "\1: " & re.Replace(s, patter, "\1", O) Debug.Print "$2: " & re.Replace(s, patter, "$2", O) & " <---> " & "\2: " & re.Replace(s, patter, "\2", O) Debug.Print "$3: " & re.Replace(s, patter, "$3", O) & " <---> " & "\3: " & re.Replace(s, patter, "\3", O) Debug.Print "$-test: " & re.Replace(s, patter, "$1" & "v" & "$3", O) & " <---> " & _ "\-test: " & re.Replace(s, patter, "\1" & "v" & "\3", O) Set re = Nothing End Sub
Ergibt das im DF:Code:
fischer's fritze fischte frische pinguine. fischer's fritze killte frische fische. fischer's fritze fischte frivole fische. fiedler's fritze fischte frische fische.$1: ischer's fritze ischte frische ische. <---> \1: ischer's fritze ischte frische ische. $2: fffische. <---> \2: fffische. $3: ische. <---> \3: ische. $-test: vischer's fritze vischte frische vische. <---> \-test: vischer's fritze vischte frische vische.
Erstaunt bin ich, dass hier $n oder \n keinen Walzer zu spielen scheinen *wunder*Das war nur ein kleiner, erster Test, da geht aber ja glaub' noch bissel mehr ..., das hab' ich (noch) nicht probiert, *erstmal reinfuchsen muss* ;-) lg Nancy -- just for fun: Nachtrag: Code:
patter = "fisch(?=er's)(.*)fri(?=tze)(.*)fisch(?=te)(.*?fri)?(.*?)fisch(e)" Debug.Print re.Replace(s, patter, "fiedl\1ka\2kill\3vole pinguin\5", O) '==>: fiedler's katze killte frivole pinguine.
Den string fand ich einfach heavy zum testen ...;;-))Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004
|
erstellt am: 13. Mrz. 2007 09:43 <-- editieren / zitieren --> Unities abgeben:
Hi Nancy, dankeschön :-) Ich dachte aber eigentlich eher an die Neuerungen im Vergleich zur 'alten' Version 0.7. Hätte das wohl auch schreiben sollen :-( FWIW, die Option s wie SingleLine bewirkt daß ein Punkt auch auf einen Zeilenwechsel paßt. Das gehört, wie übrigens auch die Lookbehinds, zu den Dingen die VBScript.RegExp leider nicht kann. Einen schönen Tag noch, Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 Win7, ACA2010
|
erstellt am: 13. Mrz. 2007 21:23 <-- editieren / zitieren --> Unities abgeben: Nur für bst
Hallo Bernd, hab' mal fix die vbp-frm in ein vba-xl Userform gebracht [nix wundern, hab auf die Schnelle ein IMG der Form auf die Userform gelegt, als Hilfe/Authentität;-)] Ich hoffe, ich hab alles richtig zugeordnet, erste Test's sind gelaufen. Was jetzt direkt neu ist - keine Ahnung - evtl. die SQL-Kiste und das X(Ht)ML? Wobei mir noch bissel unklar ist, was der Unterschied zwischen XHTML und XML ist? lg Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003
|
erstellt am: 13. Mrz. 2007 22:00 <-- editieren / zitieren --> Unities abgeben: Nur für bst
Ich nochmal;-) ich muss jetzt mal was hinterfragen betreffend der Sub:
Code:
Private Sub btnHTMLPrepare_Click() Set escRE = re.Prepare("(.*?)(<\w[\w\d]*(?:\s+\w[\w\d]*(?:\s*=\s*(?:[^"" '><\s]+|(?:'[^']*')+|(?:""[^""]*"")+))?)*\s*>|</\w[\w\d]*>|$)", "ge") escRE.Eval "sub JendaRex::Sandbox::esc {" & _ " my $s = $_[0];" & _ " $s =~ s/&(?!(?:\w+|#\d+);)/&/g;" & _ " $s =~ s/</</g;" & _ " $s =~ s/>/>/g;" & _ " $s;" & _ "}" End Sub
Was zum Deibel soll A) der Part:
Code: (.*?)(<\w[\w\d]*
bewirken? Die \d stecken ja in \w schon mit drinnen, versteh' irgendwie die Konstellation nicht ... würde es aber gerne begreifen wollen.Ebenso unverständlich, Part B):
Code: (?:[^"" '><\s]+|(?:'[^']*')+|(?:""[^""]*"")+))?)*\s*>
... ziemlich starker Tobak IMHO, wobei mir das Lesen von RE's generell schwerer fällt, als das Schreiben. Geht's euch auch so?Und natürlich, wer eine Idee hat, was die zwei Parts da treiben - wäre schön, weil bei mir ist grade irgendwie Rätselraten angesagt. lg Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
Beiträge: 4755 Registriert: 27.09.2000 Dell precision M4300, 4GB Arbeitsspeicher NVidia FX360M Windows XP professional SP3 CATIA V5 R16SP9, R17SP8, R18SP8, R19SP6 Adobe Acrobat 8 Linux: Ubuntu 8.04LTS
|
erstellt am: 14. Mrz. 2007 05:24 <-- editieren / zitieren --> Unities abgeben: Nur für bst
|
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004
|
erstellt am: 14. Mrz. 2007 10:22 <-- editieren / zitieren --> Unities abgeben:
Morgen Nancy, 1. \w[\w\d]* Sehe ich eigentlich auch so. Sollte sich auch als \w\w* oder als \w+ schreiben lassen. 2. da geht es M.E. darum alle Zeichen innerhalb von Zeichenketten zuzulassen, nicht nur \w+ (?:'[^']*')+ sind Zeichenketten innerhalb eines einfachen ' (?:""[^""]*"")+ sind Zeichenketten innerhalb eines " (die " müssen ja innerhalb eines VBA-Strings verdoppelt werden) [^"" '><\s]+ verstehe ich nicht, [^""'<>]+ wäre mir ja noch klar, alle Zeichen mit Ausnahme von Strings und HTML-Tags, wozu aber hier noch ein Leerzeichen und das \s gut sein soll ??? Das \s nimmt er ja vielleicht (??) um Zeilenumbrüche auszuschließen, aber dann hörts bei mir auch auf :-( FWIW, prepare kompiliert einen RegEx für den späteren Gebrauch. Mit eval kann man Perl-Code ausführen. IMHO wird das Ergebnis der letzten Zuweisung zurückgeliefert. @_ ist ein Array mit den an eine Funktion übergebenen Parametern, d.h. $_[0] sollte wohl der 1. Parameter sein. Was das aber nun hier bewirkt, leider (noch) keinen Plan lg, Bernd -- Option Explicit Sub x() Dim re As Object, re2 Set re = CreateObject("jenda.rex") Set re2 = re.Prepare("\w") Debug.Print re.test("2", "\w") Debug.Print re2.test("2") Debug.Print re.eval("{my $s=2; my $x; $x = $s+4;}") Set re = Nothing Set re2 = Nothing End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 Win7, ACA2010
|
erstellt am: 15. Mrz. 2007 22:40 <-- editieren / zitieren --> Unities abgeben: Nur für bst
Abend zusammen :-) @Roland: Meinte ich ganz global pauschal, hab' aber inzwischen neugierigerweise bei wiki nachgeguckt;-) Meinem groben Verständniss nach ist also XHTML eine Erweiterung von HTML, mit teils variierter Syntax (z.B. das <br /> statt nur <br> oder <BR> in HTML). Vielleicht hängt ja genau das etwas mit dem oben geposteten RegExp zusammen? Da dieses ja dann HTML und XHTML in Einem bedienen soll? (Eine spezielle Trennung zwischen HMTL und XHTML gibts ja nicht bei Jenda - habe zumindest keinen Button/Code gefunden) @Bernd: Danke - für's 'Genausosehen';-) *echt gegrübelt hab* Nach Austausch der \w[\w\d]* in ein simples /w+ hats noch funktioniert:-) Würde mich ja echt mal interessieren, was in der dll steht ..., ob er das komplett einmal neu geschrieben hat, also die Definitionen von \w und \d und überhaupt, oder ob er auf irgendewtas aufbaut? (1x selberschreiben stell' ich mir mordsschwierig vor) zu 2.) ja - die "" in vba sind meine gaaaanz speziellen Freunde Ich versuche da immer, wenn irgendwie geht, nen Riesenbogen drum zu machen ... Möglicherweise hat das Pattern ja was mit dem (wie vor) XHTML zu tun - aber echt keine Ahnung, mich verwirrt es auch nach wie vor. (Aber nicht alle Codes vom Verfasser sind Gesetz;-) wenn man also vereinfachendere/logischere Dinge einbringen kann, solange der Gesamtcode noch funktioniert, warum eigentlich nicht? (bezogen auf opensource) Die Geschichte mit dem object.eval(uate)("{my $s=2; my $x; $x = $s+4;}") ..., mal blöde gefragt: alles was innerhalb der geschweiften Klammern steht ist Perl-Syntax für ein Stringarray in Perl - ja? [ich kenn' mich ganz dolle aus ;;;-)))))] Ich denke aber mal, das kann hier manchmal eh' syntaxmässig etwas querbeet gehen, die vb(a)-rex bilden ja eher einen Randbereich, weswegen die Jenda.Rex wirklich interessant ist :-). lg Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004
|
erstellt am: 15. Mrz. 2007 23:15 <-- editieren / zitieren --> Unities abgeben:
Abend Nancy, der Sourcecode ist dabei ;-) Schau Dir mal JendaRex.pm an. und, nein. Meine Perl-Kenntnisse sind auch bescheiden, aber IMHO definiert man mit my lokale Variablen. Perl unterscheidet M.E. 3 Variablentypen Skalare, Arrays und Hashes. Diese werden durch vorangestellte Metazeichen identifiziert. $ = Skalar, @=Array, %=Hash. {...} ist ein Block, das Semikolon ist (wie in C) Befehlsende. {my $s=2; my $x; $x = $s+4;} wäre also in VBA wohl am ehesten mit sowas vergleichbar: Function OhneNamen() as Variant Dim s as Variant, x as Variant s = 2 x = s + 4 OhneNamen = x End Sub CU, Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
Beiträge: 4755 Registriert: 27.09.2000 Dell precision M4300, 4GB Arbeitsspeicher NVidia FX360M Windows XP professional SP3 CATIA V5 R16SP9, R17SP8, R18SP8, R19SP6 Adobe Acrobat 8 Linux: Ubuntu 8.04LTS
|
erstellt am: 16. Mrz. 2007 05:28 <-- editieren / zitieren --> Unities abgeben: Nur für bst
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|