![]() |
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:
und zwar zusammen mit der RegEx '<.+>':
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;
Delphi-Quellcode:
das liefert dann für den Text '<Test>er and <Test>s and <Sheep>++':
procedure TForm3.Button1Click(Sender: TObject);
begin edit1.Text := regl(edit2.Text, '<.+>'); // finde '<' gefolgt von einem oder mehreren beliebigen Zeichen gefolgt von '>' end; <Test>|,<Test>|,<Sheep>|, Grüße, Uli |
Re: Regex geht nicht mehr?
statt den Repeat...Until?
|
Re: Regex geht nicht mehr?
Uli hat doch bereits eine Lösung, schau Dir die mal an.
|
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;
|
Re: Regex geht nicht mehr?
Da gibt'S eine Property dafür: matchLength + matchstart glaub ich.
Uli |
Re: Regex geht nicht mehr?
Delphi-Quellcode:
Hab ich das falsch verstanden?
pos[Length(code) - 1] := regexMachine.matchedstart; // Warum ist das den Falsch
~~~~~~~~~~~~ |
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:
Und die Positionbestimmen:
regexMachine.MatchedExpressionLength;
Delphi-Quellcode:
Hier noch mal der gesamte Quelltext (fehlerfrei!):
regexMachine.MatchedExpressionOffset;
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. |
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