AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi XE3 RegEx - Variablen im Fließtext finden, Kommentarzeilen ignorieren

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

Ein Thema von jensw_2000 · begonnen am 17. Mär 2013 · letzter Beitrag vom 18. Mär 2013
Antwort Antwort
jensw_2000
(Gast)

n/a Beiträge
 
#1

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

  Alt 17. Mär 2013, 14:21
Delphi-Version: XE2
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 ...
Angehängte Dateien
Dateityp: zip test-app.zip (906,6 KB, 3x aufgerufen)

Geändert von jensw_2000 (17. Mär 2013 um 19:39 Uhr)
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

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

  Alt 17. Mär 2013, 18:28
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]
FRegEx.RegEx := '(?<=(?<!(''TEMPLATE_INSERT_|''TEMPLATE_INSERT_))) %%(script|)_[a-z]+_[a-z0-9]+%%';
Ist zwar nicht falsch, aber
FRegEx.RegEx := '(?<=(?<!(''TEMPLATE_INSERT_))) %%(script|)_[a-z]+_[a-z0-9]+%%';
einmal reicht aus.
[/EDIT]

Gruß
Volker Zeller

Geändert von Volker Z. (17. Mär 2013 um 18:47 Uhr)
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#3

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

  Alt 17. Mär 2013, 19:16
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 ...
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#4

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

  Alt 18. Mär 2013, 02:46
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ß
Volker Zeller
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#5

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

  Alt 18. Mär 2013, 05:55
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. :

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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 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