Home » Tutorials » Object Pascal/RTL » Reguläre Ausdrücke in Delphi

Reguläre Ausdrücke in Delphi

Interna

Optimierung

Nun haben wir alle Möglichkeiten gesehen, die Delphi mit TRegEx anbietet. Dabei gibt es aber noch Optimierungsmöglichkeiten für den Fall, dass man reguläre Ausdrücke in größerem Umfang nutzt. In unseren bisherigen Beispielen wird der reguläre Ausdruck bei jedem Aufruf aufs Neue angegeben und interpretiert. Das kostet Laufzeit.
Wenn man also weiß, dass man denselben regulären Ausdruck mehrfach anwenden will, kann man TRegEx dazu bringen, ihn nur einmal zu interpretieren. Dazu wird der Konstruktor Create von TRegEx aufgerufen und ihm das Pattern mitgegeben:

procedure TForm1.Button1Click(Sender: TObject);
var
  reg: TRegEx;
begin
  reg := TRegEx.Create(regex);
  ShowMessage(BoolToStr(reg.IsMatch(input), true));
end;

Durch den Aufruf von Create bekommen wir eine Instanzvariable (im Beispiel: reg), an der wir die bekannten Methoden aufrufen können. Das Pattern muss bei diesen Aufrufen dann nicht mehr mitgegeben werden.
Nach der Verwendung muss kein „Free“ aufgerufen werden, da es sich – wie gesagt – bei TRegEx nicht um eine Klasse, sondern um ein Record handelt.

Wie arbeitet TRegEx?

Wer sich den Code von TRegEx anschaut, wird feststellen, dass es dort keine Delphi-Implementierung zum Parsen regulärer Ausdrücke gibt. Vielmehr greift TRegEx auf die Klasse TPerlRegEx zurück. Wie in der Einleitung erwähnt, sind die Implementierungen regulärer Ausdrücke in der Regel Perl-kompatibel.
TPerlRegex ist ein Wrapper um die Original-C-Implementierung der eingangs ewähnten PCRE-Bibliothek. Diese liegt in Form von OBJ-Dateien vor und wird direkt in die Delphi-Anwendung gelinkt, so dass zur Laufzeit keine externen Abhängigkeiten bestehen. Delphi verwendet also direkt die Original-Implementierung, so dass man in Delphi die gleichen regulären Ausdrücke verwenden kann wie in anderen Programmiersprachen.
Delphi verwendet intern UTF-16, während die PCRE-Bibliothek (und auch TPerlRegEx) mit UTF-8 arbeitet. Die Umwandlung von UTF-16 (VCL) nach UTF-8 (PCRE) findet automatisch in der Unit RegularExpressions. Wer von vornherein mit UTF-8-Daten arbeitet kann aus Performance-Gründen überlegen, direkt auf TPerlRegEx zuzugreifen, um sich die Hin- und Her-Umwandlung über UTF-16 zu sparen. Im Normalfall sollte aber TRegEx den Vorzug gegeben werden.

Video zu RegEx

Wer sich das Thema noch einmal audiovisuell zu Gemüte führen möchte, dem sei der Vortrag „Reguläre Ausdrücke“ von Daniel R. Wolf auf der Deutschen Coderage 2016 empfohlen. Eine Aufzeichnung ist hier zu finden.