Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Regex geht nicht mehr? (https://www.delphipraxis.net/137903-regex-geht-nicht-mehr.html)

ULIK 31. Jul 2009 17:13

Re: Regex geht nicht mehr?
 
Also:

1) Deine eingestellte RegEx findet nur Texte der Bauart: ein '<', gefolgt von einem beliebigen Zeichen, gefolgt von '>', also so was wie <t> aber nicht <tt>!
2) SubexpressionCount bezieht sich auf die Anzahl der Gruppierungsklammern des regulären Ausdrucks: bei '<.>' gibt es keine, also 0. Bei '<(.+)>' ist der Count = 1!
3) Was Du suchst ist MatchedExpression und zwar zusammen mit der Option UnGreedy (behaute ich einfach mal :mrgreen: )

Schau Dir mal den Code an, der läuft bei mir fein:
Delphi-Quellcode:
function regl(subj, expr: string): string;
var
  code: array of string;
  pos: array of integer;
  regexMachine: TPerlRegEx;
begin
  SetLength(code, 0); //Array initialisieren
  regexMachine := TPerlRegEx.Create(nil);
  try
    regexMachine.RegEx := expr;
    regexMachine.Subject := subj;
    regexMachine.Options := regexMachine.Options + [preUnGreedy];
    if regexMachine.Match then
    begin
      repeat
        setlength(code, Length(code) + 1); // Treffer um neu gefundenen erweitern
        code[Length(code) - 1] := regexMachine.MatchedExpression; // Neue Treffer in das code Array eintragen
      until not regexMachine.MatchAgain; // und weitersuchen. Abbruch, wenn kein Treffer mehr

      result := verarbeitung(code,pos); // jetzt ALLE Treffer verarbeiten
    end;

  finally
    regexMachine.free;
  end;
end;
und zwar zusammen mit der RegEx '<.+>':
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
begin
  edit1.Text := regl(edit2.Text, '<.+>'); // finde '<' gefolgt von einem oder mehreren beliebigen Zeichen gefolgt von '>'
end;
das liefert dann für den Text '<Test>er and <Test>s and <Sheep>++':

<Test>|,<Test>|,<Sheep>|,



Grüße,
Uli

Chefx 31. Jul 2009 17:15

Re: Regex geht nicht mehr?
 
statt den Repeat...Until?

DeddyH 31. Jul 2009 17:20

Re: Regex geht nicht mehr?
 
Uli hat doch bereits eine Lösung, schau Dir die mal an.

Chefx 31. Jul 2009 17:26

Re: Regex geht nicht mehr?
 
Hab ich auch gesehen war bloß zu schnell mit dem versenden! :wink:

Genau sowas hab ich gesucht (die lösung ist genial)! :thumb:
vielen dank erstmal allen die mir Geholfen haben (DeddyH,ULIK)!

Und jetzt zu der Pos.

Wie bekomme ich die Position des Gefundenen Strings Raus?
Wie in der C# gibt es ja den befehl
Code:
mc[i].Index;

ULIK 31. Jul 2009 17:29

Re: Regex geht nicht mehr?
 
Da gibt'S eine Property dafür: matchLength + matchstart glaub ich.

Uli

Chefx 31. Jul 2009 17:34

Re: Regex geht nicht mehr?
 
Delphi-Quellcode:
pos[Length(code) - 1] := regexMachine.matchedstart; // Warum ist das den Falsch
                                      ~~~~~~~~~~~~
Hab ich das falsch verstanden?

Chefx 31. Jul 2009 21:15

Re: Regex geht nicht mehr?
 
ich hab mal ein bissel probiert.
Hab das jetzt gefunden!
Die funktion für die Länge ist in Tperlregex:
Delphi-Quellcode:
regexMachine.MatchedExpressionLength;
Und die Positionbestimmen:
Delphi-Quellcode:
regexMachine.MatchedExpressionOffset;
Hier noch mal der gesamte Quelltext (fehlerfrei!):
Delphi-Quellcode:
function verarbeitung(code:array of string;pos:array of integer):string;
var
  i:integer;
begin
result:='';
for i := low(code) to high(code) do
      result := result + code[i] + '|' + inttostr(pos[i]) + ',';
end;

function regl(subj, expr: string): string;
var
  code: array of string;
  pos: array of integer;
  regexMachine: TPerlRegEx;
begin
  SetLength(code, 0); //Array initialisieren
  SetLength(pos, 0);  //
  regexMachine := TPerlRegEx.Create(nil);
  try
    regexMachine.RegEx := expr;
    regexMachine.Subject := subj;
    regexMachine.Options := regexMachine.Options + [preUnGreedy];

    if regexMachine.Match then
    begin
      repeat
        setlength(code, Length(code) + 1);// Treffer um neu gefundenen erweitern
        setlength(pos, Length(pos) + 1); //
        code[Length(code) - 1] := regexMachine.MatchedExpression;// Neue Treffer in das code Array eintragen
        pos[Length(code) - 1] := regexMachine.MatchedExpressionOffset - 1;//Position des Treffers
      until not regexMachine.MatchAgain; // und weitersuchen. Abbruch, wenn kein Treffer mehr
      result := verarbeitung(code,pos); // jetzt ALLE Treffer verarbeiten
    end;

  finally
    regexMachine.free;
  end;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
edit1.Text:=regl(edit2.Text,'<.+>');
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 Uhr.
Seite 4 von 4   « Erste     234   

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 by Thomas Breitkreuz