RegExp Kurs: C++ / Qt

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
matthiasklein
Beiträge: 61
Registriert: 25.11.2010 20:56:44

RegExp Kurs: C++ / Qt

Beitrag von matthiasklein » 03.07.2022 09:14:31

Kursübersicht

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 NoPaste-Eintrag41732 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
Reguläre Ausdrücke in der C++ Standardbibliothek

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;
}
Das Beispiel lässt sich folgendermaßen starten:

Code: Alles auswählen

$ ./replexp-cpp '#[A-Fa-f0-9]{6}'
Als Kommandozeilenargument wird die Regexp #[A-Fa-f0-9]{6} verwendet, womit hexadezimale Farbangaben mit einleitendem Rautezeichen gematched werden können. Die Interaktion mit dem Programm sieht dann etwa folgendermaßen aus:

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
Eingabezeilen werden nach Betätigung von [Return] nur dann erneut ausgegeben, sofern sie der Regexp genügen (#FFFFFF, #ffffff, #232323 usw.), andernfalls (#abc, #foobar, #999) jedoch nicht.

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;
}
Der Aufruf und die Ausgabe entspricht dem obigen Beispiel.

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
Aufgabe 2
Schreibe eine Funktion welches ein String in Camel Case Schreibweise in einzelne Wörter zerlegt.

Die folgende Eingabe:

Code: Alles auswählen

diesIstEinCamelCaseString
soll zu folgender Ausgabe führen:

Code: Alles auswählen

dies Ist Ein Camel Case String
Aufgabe 3
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.

Antworten