Reguläre Ausdrücke

Martin Kompf

Reguläre Ausdrücke sind ein mächtiges Instrument, um Texte zu durchsuchen und zu formatieren. In Programmiersprachen wie Perl sind sie daher schon fest eingebaut; der C++ Programmierer kann Bibliotheken wie Boost regex oder pcre einsetzen.

Boost Regex

Die Regex Library ist Bestandteil des Boost Projekts. Auf der Homepage von boost.org finden sich detaillierte Instruktionen zur Installation der Libraries unter Windows.

Einfacher verläuft die Installation unter Linux - hier sind die Boost Libraries in der Regel über den Packagemanager installierbar. Unter Debian heißt das entsprechende Paket libboost-regex-dev. Die Verwendung von Boost regex erfolgt dann über das Inkludieren des Headers boost/regex.hpp und das Hinzulinken der Library mit der Option -lboost_regex.

Reguläre Ausdrücke sind Entwicklern, die in Perl programmieren oder die Unix-Tools awk, sed oder egrep verwenden, bereits in Fleisch und Blut übergegangen. Auch für den C-Programmierer gibt es seit langem die POSIX Funktionen regcomp und regexec (nur nicht für Microsoft Visual C++). Regex verwendet zur Angabe der regulären Ausdrücke genau die gleiche, POSIX konforme Syntax wie diese bekannten Tools. Jedoch besitzt regex ein komfortables C++ Interface, welches den Einsatz von regulären Ausdrücken im C++ Programm sehr einfach macht.

Die Funktion

#include <boost/regex.hpp>

bool check_car_number(const string s)
{
    static const boost::regex e("\\u{1,3}-\\u{1,2} \\d{1,4}[ \\0]*");
    return regex_match(s, e);
}

überprüft zum Beispiel durch Aufruf der Funktion regex_match, ob die im String s übergebene Zeichenkette ein in Deutschland gültiges Autokennzeichen ist. Der Schlüssel dazu ist der reguläre Ausdruck e. Hierin bedeutet die Sequenz \u{1,3} eine Folge von ein bis drei Großbuchstaben und \d{1,4} ein bis vier Ziffern. Andere Zeichen, wie - oder das Leerzeichen, werden literal (so wie sie sind) interpretiert. Da der reguläre Ausdruck als Zeichenkette in einem C++ Programm steht, müssen bestimmte Zeichen, die eine Sonderbedeutung für den C Compiler haben, mit dem Backslash \ maskiert werden. Der reguläre Ausdruck \u muss dann also mit \\u kodiert werden.

Weitere Funktionen von Boost regex sind regex_split zum Aufteilen eines Textes an einem bestimmten Muster oder regex_merge zum Suchen und Ersetzen von Zeichenketten. Für eine ausführliche Referenz dieser Funktionen und weiterführende Beispiele sei auf die Dokumentation von Boost regex verwiesen.

PCRE

Eine leichtgewichtigere Alternative zu Boost regex ist PCRE - Perl Compatible Regular Expressions. Das Übersetzen dieser Library ist auch für Windows unter Zuhilfenahme von CMake relativ einfach möglich. Debian Benutzer installieren einfach das Paket libpcre3-dev. Dadurch erhält man sowohl die pcrc Library im Plain-Old-C Stil als auch den C++ Wrapper pcrecpp.

Die Funktion zur Überprüfung von Autokennzeichen lässt sich unter Zuhilfenahme von pcrecpp dann folgendermaßen umschreiben:

#include <pcrecpp.h>

bool check_car_number(const std::string s)
{
    static const pcrecpp::RE re("[A-Z]{1,3}-[A-Z]{1,2} \\d{1,4}");
    return re.FullMatch(s);
}

Statt der speziellen «character class» \u wird hier der «character range» [A-Z] verwendet. Beim Linken des Programms ist mittels -lpcrecpp die Library einzubinden.

Dem Einsteiger in die Thematik der regulären Ausdrücke sei insbesondere die Lektüre der Manual Page perlre empfohlen.