![]() |
Delphi-Version: XE2
XE3 RegEx - Variablen im Fließtext finden, Kommentarzeilen ignorieren
Liste der Anhänge anzeigen (Anzahl: 1)
Ich versuche gerade per RegEx alle Variablen in einem VB Script Template zu finden, die nicht in einer Kommentarzeile stehen.
Die Variablen haben immer das Format %%irgendwas%%. Zusätzlich sollen alle Variablen von den Treffern ausgeschlossen werden, die mit %%ARRAY_ beginnen. Das klappt schon mal weitestgehend gut mit folgendem Ausdruck:
Code:
Problem ist, dass ich es nicht schaffe die Variablen in den Kommentarzeilen zu ignorieren.
(?!%%[Aa][Rr][Rr][Aa][Yy]_*)(%%[a-zA-Z][a-zA-Z]*[a-zA-Z0-9_]*%%)
Kommentarzeilen beginnen mit ' (ggf. mit führenden Leerzeichen). Zum Erkennen einer Kommentarzeile ist der Ausdruck ([\ ]*[']1*.*) schon mal ganz OK. Irgendwie will die Vorab-Filterung via (?![\ ]*[']1*.*) nicht so wie ich ... Mein VB Script Template sieht etwa so aus:
Code:
Spielprojekt hängt dran.
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000
'-------------------------------------------------------------------------------------------- ' Globale Variablen deklarieren '-------------------------------------------------------------------------------------------- Dim fso, f, Zeile, Feld Dim SCRIPT_LANGUAGE 'TEMPLATE_INSERT_BEGIN "%%SCRIPT_ATTRIBUTE_NAMES%%" %%SCRIPT_ATTRIBUTE_NAMES%% 'TEMPLATE_INSERT_END "%%SCRIPT_ATTRIBUTE_NAMES%%" '-------------------------------------------------------------------------------------------- ' ENDE Globale Variablen '-------------------------------------------------------------------------------------------- '-------------------------------------------------------------------------------------------- ' Variablen für GUI Definitionen deklarieren '-------------------------------------------------------------------------------------------- Dim objDomain ' .. das globale Domain-Object Dim objAdRoot ' .. das globale AD-Stammverzeichnis-Objekt Kann mir jemand bei dem RexEx helfen? Grüße Jens PS: Der Ausdruck ([\s]*[']+.*)(?!%%[Aa][Rr][Rr][Aa][Yy]_*)(%%[a-zA-Z][a-zA-Z]*[a-zA-Z0-9_]*%%) "erkennt" genau die beiden Zeilen, in denen auskommentierte Variablen stehen. Wenn ich den Lookahead negiere (?![\s]*[']+.*)(?!%%[Aa][Rr][Rr][Aa][Yy]_*)(%%[a-zA-Z][a-zA-Z]*[a-zA-Z0-9_]*%%) dann werden die auskommentierten Variablen aber wieder mit erkannt. Mann, ist das kompliziert ... :| |
AW: XE3 RegEx - Variablen im Fließtext finden, Kommentarzeilen ignorieren
Hallo,
Du kannst ja mal folgenden probieren:
Delphi-Quellcode:
[EDIT]
type
TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } FRegEx : TPerlRegEx; procedure RegExMatch (Sender : TObject); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.RegExMatch (Sender : TObject); begin ShowMessage (FRegEx.MatchedText) end; procedure TForm1.Button1Click(Sender: TObject); begin FRegEx := TPerlRegEx.Create; try FRegEx.Subject := UTF8Encode (Memo1.Lines.Text); FRegEx.Options := [preCaseLess]; FRegEx.RegEx := '(?<=(?<!(''TEMPLATE_INSERT_|''TEMPLATE_INSERT_))) %%(script|)_[a-z]+_[a-z0-9]+%%'; FRegEx.OnMatch := RegExMatch; if FRegEx.Match then repeat until not FRegEx.MatchAgain; finally FreeAndNil (FRegEx) end end;
Delphi-Quellcode:
FRegEx.RegEx := '(?<=(?<!(''TEMPLATE_INSERT_|''TEMPLATE_INSERT_))) %%(script|)_[a-z]+_[a-z0-9]+%%';
Ist zwar nicht falsch, aber
Delphi-Quellcode:
FRegEx.RegEx := '(?<=(?<!(''TEMPLATE_INSERT_))) %%(script|)_[a-z]+_[a-z0-9]+%%';
einmal reicht aus. [/EDIT] Gruß |
AW: XE3 RegEx - Variablen im Fließtext finden, Kommentarzeilen ignorieren
Hi Volker,
ich bekomme das nicht "verallgemeinert". Nicht alle Kommentare beginnen zwangsläufig mit 'TEMPLATE_INSERT_ und Kommentare hinter "aktiven" Variablen sollen schon erlaubt sein... Der RegEx (?<=(?<!(\n[\s]*'))) wirft die Meldung, dass der Lookbehind keine fixe Länge hat. Magst Du dir kurz die Test-Exe aus dem ersten Eintrag runterladen? Dann siehst Du was ich meine ... |
AW: XE3 RegEx - Variablen im Fließtext finden, Kommentarzeilen ignorieren
Hallo,
sorry, den Anhang habe ich zunächst nicht bemerkt. So hat halt der Vorschlag nur auf dem Code-Schnipsel funktioniert. Ich habe mich nun einige Zeit mit der Geschichte auseinandergesetzt, drehe mich aber hier irgendwie im Kreis (Du machst es einem aber auch nicht einfach, wenn ein Teil gelöst, dann legen sich irgendwo Gänsefüßchen, Einrückungen etc. quer und jetzt sehe ich auch die Bäume vor lauter Wald nicht mehr oder war andersherum). Naja, wenn es mein Projekt beträfe, dann würde ich wohl an der Stelle mit der Suche nach "dem" Pattern abbrechen und mit einem geeigneten Hilfspattern die Vorselektion machen und mir über das OnMatch die Daten merken (was einmal reinkommt einmal merken), um sie im Nachgang auszuwerten. Mit
Delphi-Quellcode:
sollte das dann auch funktionieren. Sorry, dass ich keine bessere Hilfe sein konnte
procedure TForm1.RegExMatch (Sender : TObject);
begin // Do whatever you think is necessary to do end; procedure TForm1.Button1Click(Sender: TObject); begin FRegEx := TPerlRegEx.Create; try FRegEx.Subject := UTF8Encode (Memo1.Lines.Text); FRegEx.Options := [preCaseLess]; FRegEx.RegEx := '(?!%%[array]_*)%%\w*%%'; FRegEx.OnMatch := RegExMatch; if FRegEx.Match then repeat until not FRegEx.MatchAgain; finally FreeAndNil (FRegEx) end end; Gruß |
AW: XE3 RegEx - Variablen im Fließtext finden, Kommentarzeilen ignorieren
Code:
Oh je, jetzt habe ich aber ein schlechtes Gewissen. ::wink:
"Heute, 03:46 by Volker Z." .... Ich habe mich nun einige Zeit mit der Geschichte auseinandergesetzt
Habe mich echt auch bis kurz nach 2:00 Uhr dran probiert und bin dann verzweifelt schlafen gegangen. Die Lösung hast Du aber trotzdem gefunden. Eine kleine Delphi-Funktion kann sowas ganz sicher besser..
Code:
FRegEx.Subject := UTF8Encode (RemoveCommentLines(Memo1.Lines.Text));
Danke Dir. Grüße Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz