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