Reguläre Ausdrücke in Delphi
Ersetzen und Splitten
In den vorigen Beispielen haben wir gesehen, wie man mit Hilfe regulärer Ausdrücke in einem Text suchen und finden kann.
Der nächste Schritt ist es, die gefundenen Treffer durch etwas anderes zu ersetzen. Auch das wird von TRegEx unterstützt. Da man einen Treffer womöglich nicht nur durch einen statischen Text ersetzen möchte, sondern durch etwas, das auf den Eigenschaften des Treffers basiert, gibt es mit TMatchEvaluator einen Prozedurentyp, über den man eine Prozedur/Methode erstellen kann, die für die Ersetzung zuständig ist. Als Eingabeparameter hat diese den aktuellen Treffer vom Typ TMatch.
Folgende Methode wandelt den Text jedes Treffers in Großbuchstaben um und hängt die Position im Inputtext an:
type TForm1 = class(TForm) private { Private-Deklarationen } function MyReplace(const Match: TMatch): string; end; ... function TForm1.MyReplace(const Match: TMatch): string; begin Result := UpperCase(match.Value) + IntToStr(match.Index); end;
Nun muss diese neue Methode nur noch einer Variablen vom erwähnten Typ TMatchEvaluator zugewiesen und die Replace-Methode von TRegEx aufgerufen werden:
procedure TForm1.Button1Click(Sender: TObject); var myEval: TMatchEvaluator; begin myEval := MyReplace; // MyReplace ist der Name der oben definierten Ersetzungs-Methode ShowMessage(TRegEx.Replace(input, regex, myEval)); end;
Die Ausgabe lautet: „DELPHI1 ist ein tolles Werkzeug, um Desktop-Anwendungen zu entwickeln. Ich nutze DELPHI82 XE3 schon längere Zeit.“
Splitten
Zu guter Letzt bietet TRegEx auch eine Methode „Split“, um den Eingabetext anhand eines regulären Ausdrucks in mehrere Teile zu zerteilen.
Folgendes Beispiel zerteilt unseren Beispieleingabetext am Satzende in mehrere Teile. Da das Punkt-Zeichen in regulären Ausdrücken eine besondere Bedeutung hat, muss es mit einem Backslash davor maskiert werden.
regex := '.'; procedure TForm3.Button1Click(Sender: TObject); var list: TArray; item: String; begin list := TRegEx.Split(edInput.Text, edRegex.Text); for item in list do begin ShowMessage(item); end; end;
Da der Punkt als Trennzeichen interpretiert wird, ist er nach dem Split in keinem String mehr enthalten. Die Liste an Teiltexten besteht aus drei Elementen: dem ersten Satz bis vor den ersten Punkt, dem zweiten Satz bis vor den zweiten Punkt und einem leeren String aufgrund des Punktes am Ende.