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.
1 2 3 4 |
//Header einbinden #include <iostream> //std::cout #include <string> //std::string #include <regex> //std::regex |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// einfache Verwendung std::string search1("fuchs55 tina22"); std::regex reg1(R"(([a-z]+)(\d+))"); std::smatch match1; if (std::regex_search(search1, match1, reg1)) { for (unsigned int i = 0; i < match1.size(); ++i) { std::cout << "Position: " << match1.position(i) << " Länge : " << match1.length(i) << " - " << match1.str(i) << std::endl; } } |
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).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Alle Instanzen des Suchstrings finden mit sregex_iterator std::string search2("fuchs55 12bert sofia tina48 eismann20"); std::regex reg2(R"(([a-z]+)(\d+))"); std::smatch match2; std::sregex_iterator pos(search2.begin(), search2.end(), reg2); std::sregex_iterator end; for (; pos != end; ++pos) { std::cout << "Position: " << pos->position() << " Länge: " << pos->str(0).size() << " Inhalt: " << pos->str(0) << std::endl; } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// str durchsuchen nach expr und alle Instanzen ausgeben void searchString(std::string str, std::regex expr) { std::sregex_iterator pos(str.begin(), str.end(), expr); std::sregex_iterator end; for (; pos != end; ++pos) { std::cout << "Position: " << pos->position() << " Länge: " << pos->str(0).size() << " Inhalt: " << pos->str(0) << std::endl; } } |
1 2 3 4 5 6 |
// Suchfunktion verwenden und Option setzen searchString("x++17 c++03 C++17", std::regex(R"((c\++)(98|03|11|14|17))", std::regex_constants::icase)); return 0; |
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
Hinterlasse jetzt einen Kommentar