Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi XE3 RegEx - Variablen im Fließtext finden, Kommentarzeilen ignorieren (https://www.delphipraxis.net/173803-xe3-regex-variablen-im-fliesstext-finden-kommentarzeilen-ignorieren.html)

jensw_2000 17. Mär 2013 14:21

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:
(?!%%[Aa][Rr][Rr][Aa][Yy]_*)(%%[a-zA-Z][a-zA-Z]*[a-zA-Z0-9_]*%%)
Problem ist, dass ich es nicht schaffe die Variablen in den Kommentarzeilen zu ignorieren.
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:
  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
Spielprojekt hängt dran.

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

Volker Z. 17. Mär 2013 18:28

AW: XE3 RegEx - Variablen im Fließtext finden, Kommentarzeilen ignorieren
 
Hallo,

Du kannst ja mal folgenden probieren:
Delphi-Quellcode:
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;
[EDIT]
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ß

jensw_2000 17. Mär 2013 19:16

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

Volker Z. 18. Mär 2013 02:46

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:
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;
sollte das dann auch funktionieren. Sorry, dass ich keine bessere Hilfe sein konnte

Gruß

jensw_2000 18. Mär 2013 05:55

AW: XE3 RegEx - Variablen im Fließtext finden, Kommentarzeilen ignorieren
 
Code:
"Heute, 03:46 by Volker Z." .... Ich habe mich nun einige Zeit mit der Geschichte auseinandergesetzt
Oh je, jetzt habe ich aber ein schlechtes Gewissen. ::wink:

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 18:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz