regex_search in C++11 verwenden

In diesem Beitrag zu regulären Ausdrücken geht es um die Verwendung von regex_search (Link zur Beschreibung) in C++11. In einem vorhergehenden Artikel (Link zum Beitrag) haben wir uns mit regex_match befasst. Diese Methode eignet sich besonders, um einen String exakt auf ein bestimmtes Muster zu testen. Enthält der String jedoch noch zusätzliche Zeichen, ist der Einsatz von regex_search vorzuziehen. Im ersten Schritt binden wir die Header für die im Programm verwendeten Klassen ein.

Wir verwenden wieder ein Beispiel mit Benutzernamen. Unser String search1 enthält diesmal zwei Benutzernamen, die überprüft werden sollen. Obwohl beide dem Suchmuster (reg1) entsprechen, würde regex_match ein negatives Suchergebnis melden. Nicht hingegen regex_search. Wir erhalten ein Gesamt – und zwei Teilergebnisse.

Position: 0 Länge : 7 - fuchs55
Position: 0 Länge : 5 - fuchs
Position: 5 Länge : 2 - 55

Die Suche war erfolgreich, jedoch wurde sie nach dem ersten Fund abgeschlossen. In der Praxis ist es oft notwendig, alle Instanzen eines bestimmten Begriffes in einem Text zu finden. Um dies zu erreichen, bietet sich die Verwendung von sregex_iterator an. Wir erzeugen den Iterator pos und übergeben im Konstruktor einen Iterator auf den Beginn des Strings (search2.begin()), einen Iterator auf das Ende des Strings (search2.end()) sowie den regulären Ausdruck (reg2). Diese Anweisung führt automatisch zu einer Suche, die die Suchergebnisse im Objekt pos speichert.

Wir können nun mit einer for Schleife die gewünschten Ergebnisse ausgeben. Mit der Methode pos->position() erhalten wir die Position des Ergebnisses, mit pos->str(0) dessen Inhalt (Gesamtergebnis).

Position: 0 Länge: 7 Inhalt: fuchs55
Position: 21 Länge: 6 Inhalt: tina48
Position: 28 Länge: 9 Inhalt: eismann20

Der gesamte String wurde durchsucht und es wurden alle Benutzernamen, die dem gewünschten Muster entsprechen, ausgegeben. Ungültige Inhalte wurden ignoriert. Im vorigen Artikel haben wir eine Funktion für Suche und Ausgabe erstellt. Dies wollen wir nun wieder tun.

Wir definieren die Funktion searchString. Diese durchsucht den String str nach dem Muster expr. Anschließend werden alle Gesamtergebnisse, dessen Positionen und die Länge der Gesamtergebnisse ausgegeben. Zum Testen der Funktion verwenden wir einen String, der auf das Vorhandensein mehrerer gültiger C++ Standards durchsucht wird.

Position: 6 Länge: 5 Inhalt: c++03
Position: 12 Länge: 5 Inhalt: C++17

Es wurden zwei gültige Standards im Suchstring gefunden. Mit Hilfe von std::regex_constants::icase wurde bei der Suche die Groß  – und Kleinschreibung ignoriert.

Das Beispiel kann mit folgendem Befehl compiliert und ausgeführt werden:

g++ -std=c++11 cpp_regex_search.cpp && ./a.out

Das gesamte Beispiel herunterladen: cpp_regex_search.zip

Über Anton Neururer 31 Artikel
Ich bin Programmierer und Blogger. Themen die mich besonders interessieren sind Python, C++ und Javascript. Des Weiteren befasse ich mich mit Fraktalen.

Hinterlasse jetzt einen Kommentar

Kommentar hinterlassen