C++:
Löschen von Zeichen, die einem Muster entsprechen
So geht’s:
Stellen wir uns vor, wir möchten alle Ziffern aus einem String entfernen. Wir verwenden <regex>
für Musterabgleich und <algorithm>
für std::remove_if
.
#include <iostream>
#include <string>
#include <regex>
#include <algorithm>
int main() {
std::string text = "C++11 wurde im Jahr 2011 veröffentlicht!";
std::regex pattern("\\d");
text = std::regex_replace(text, pattern, "");
std::cout << text << std::endl; // Ausgabe: "C++ wurde im Jahr veröffentlicht!"
return 0;
}
Oder, ohne Regex, indem man std::remove_if
und std::isdigit
nutzt:
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
int main() {
std::string text = "C++20 wurde im Dezember 2020 eingeführt.";
text.erase(std::remove_if(text.begin(), text.end(),
[](unsigned char c){ return std::isdigit(c); }),
text.end());
std::cout << text << std::endl; // Ausgabe: "C++ wurde im Dezember eingeführt."
return 0;
}
Tiefere Einblicke
Das Löschen von Zeichen, die einem Muster entsprechen, hat sich seit den frühen Tagen der Programmierung entwickelt. Früher mussten Programmierer solche Aufgaben manuell mit Schleifen durchführen. Mit C++11 führte die Standardbibliothek <regex>
ein, was regelbasierte String-Manipulation vereinfacht.
Alternativen zum Pattern-Deletion sind unter anderem Bibliotheken von Drittanbietern oder manchmal sogar benutzerdefinierte Parsing-Funktionen, falls die Standardbibliothek nicht ausreicht.
In der Implementierung ist es wichtig, auf Performance zu achten. std::regex
kann langsamer sein als ein gut geschriebener, manueller Ansatz. std::remove_if
in Kombination mit std::isdigit
ist oft schneller, leidet aber unter mangelnder Flexibilität gegenüber komplexen Mustern. In den meisten Fällen ist Klarheit und Wartbarkeit wichtiger als Perfektion in der Performance.