Reguläre Ausdrücke in C++ / Qt
In diesem Thread geht es um die Anwendung von regulären Ausdrücken in C++.
Seit der Version C++11 hat die C++ Standardbibliothek Unterstützung für Reguläre Ausdrücke bekommen.
In der Qt Bibliothek gab es schon seit Qt3 Unterstützung für Reguläre Ausdrücke.
Einen Vergleich der verschiedenen Regular Expression Engines und deren Features gibt es hier: Comparison of regular expression engines
Das Matching Beispiel 41732 aus dem RegExp Kurs: Go wird hier mit beiden Bibliotheken umgesetzt.
Den kompletten Quellcode inkl. CMake Dateien findet Ihr auf Github
Kompilieren in der Shell wie folgt:
Code: Alles auswählen
# apt-get install build-essential cmake qtbase5-dev
git clone https://github.com/matthiasklein/regexp-cpp.git
mkdir regexp-cpp-build
cd regexp-cpp-build
cmake ../regexp-cpp
make
./app/replexp-cpp/replexp-cpp
./app/replexp-qt/replexp-qt
Die RegExp Klassen der C++ Standardbibliothek basieren auf den Boost.Regex Klassen.
Offizielle Dokumentation: Regular expressions library
Code: Alles auswählen
#include <regex>
#include <iostream>
int main(int argc, char *argv[])
{
if(argc < 2)
{
std::cerr << "usage: " << argv[0] << " [regexp]" << std::endl;
return 1;
}
std::regex pattern(argv[1]);
std::smatch match;
std::string input;
for(;;)
{
std::getline(std::cin, input);
if(std::regex_search(input, match, pattern))
std::cout << "MATCH " << match.str(0) << " from INPUT " << input << std::endl;
}
return 0;
}
Code: Alles auswählen
$ ./replexp-cpp '#[A-Fa-f0-9]{6}'
Code: Alles auswählen
#FFFFFF
MATCH #FFFFFF from INPUT #FFFFFF
#ffffff
MATCH #ffffff from INPUT #ffffff
#232323
MATCH #232323 from INPUT #232323
#abc
#foobar
#deadbeef
MATCH #deadbe from INPUT #deadbeef
#999
Reguläre Ausdrücke in Qt
Seit Qt3 gab es eine Qt eigene Implementierung in Form der QRexExp Klasse.
In Qt5 ist mit der Klasse QRegularExpression eine Implementierung auf Basis der PCRE Bibliothek hinzugekommen.
Seit Qt6 sind die veralteten QRexExp Klassen nicht mehr enthalten.
Offizielle Dokumentation: QRegularExpression
Code: Alles auswählen
#include <QRegularExpression>
#include <QDebug>
int main(int argc, char *argv[])
{
if(argc < 2)
qFatal("usage: %s [regexp]", argv[0]);
QTextStream cin(stdin);
for(;;)
{
QString input = cin.readLine();
QRegularExpression pattern = QRegularExpression(argv[1]);
QRegularExpressionMatch match = pattern.match(input);
if(match.hasMatch())
qInfo() << "MATCH " << match.captured(0) << " from INPUT " << input;
}
return 0;
}
Aufgabe 1
Schreibe eine Funktion welche überprüft ob ein Passwort folgende Kriterien erfüllt:
- mindestens eine Zahl enthält
- mindestens einen Kleinbuchstaben enthält
- mindestens einen Großbuchstaben enthält
- mindestens ein Sonderzeichen enthält
- mindestens eine Länge von 8 Zeichen hat, aber nicht mehr als 32 Zeichen lang ist
Schreibe eine Funktion welches ein String in Camel Case Schreibweise in einzelne Wörter zerlegt.
Die folgende Eingabe:
Code: Alles auswählen
diesIstEinCamelCaseString
Code: Alles auswählen
dies Ist Ein Camel Case String
Schreibe eine Klasse um mit Software Versionen im Format Semantic Versioning zu arbeiten.
Ob eine gültige Version geparst wurde soll über Funktionen abfragbar sein.
Des weiteren sollen die einzelnen Teile der Version (major, minor, patch, etc.) sollen über Getter Funktionen abfragbar sein.
Zusatzaufgabe: Implementiere bzw. überlade die Vergleichsoperatoren der Klasse.