C++: Reguläre Audrücke verstehen und umsetzen



  • #include <string>
    #include <regex>
    
    int main()
    {
        std::regex re(R"(Peter ist (\d+) Jahre alt)");
        std::smatch sm;
        std::string searchText = "Peter ist 70 Jahre alt und hat bereits Probleme sich die Schuhe anzuziehen.Peter ist 80 Jahre alt und hat bereits Probleme sich die Schuhe anzuziehen.";
    
        while(std::regex_search(searchText, sm, re))
        {
            std::cout << "entire match: " << sm.str() << "\n";
            for (std::size_t i = 1; i < sm.size(); ++i)
                std::cout << "capture group " << i << ": " << sm[i].str() << "\n";
            searchText = sm.suffix();
        }
    }
    

    Pass das für deine Qt bedürfnisse an.
    Das geht sich besser, weil searchText = sm.suffix(); ist jetzt nicht das performanteste auf der Welt, aber ich hab das schnell zusammenschmissen.



  • Du kannst auch einen regex_iterator nutzen:

    std::regex re(R"(Peter ist (\d+) Jahre alt)");
    std::string s("Peter ist 70 Jahre alt. Oder: Peter ist 60 Jahre alt?");
    auto resultIt = std::sregex_iterator(s.begin(), s.end(), re);
    for (auto it = resultIt; it != std::sregex_iterator(); ++it) {
        std::cout << "Ganzer Match: |" << it->str() << "|, das Alter ist: |" << (*it)[1].str() << "|\n";
    }
    


  • Da @DerDaVinciKot Qt in seinem Projekt verwendet schmeiß ich mal in dem Raum, dass Qt auch selbst eine Regex klasse hat. https://doc.qt.io/qt-5/qregularexpression.html



  • Hey, Ihr seid echt spitze! Beide Codes funktionieren. Ich werde mich da mal durcharbeiten damit ich das ganze auch wirklich verstehe.

    Ein schönes Wochenende noch



  • Wie mache ich es, bei regex Groß- und Kleinschreibung zu ignorieren? Beispiel:

    std::string s = "Mein Name ist Peter Pan.";
    std::regex rex("Peter");
    if (std::regex_search(s, rex))
    {
        qDebug() << "Gefunden!";
    }
    

    Ich möchte das "Peter", "peter", "PETER" usw gefunden wird. Das lässt sich zwar mit Zeichenklassen lösen: [Pp][Ee][Tt]Ee]Rr], aber es soll auch eine viel einfachere Funktion geben die Groß- und Kleinschreibung ignoriert. Bei egrep geht das z.B. mit -i. Wie bekomme ich das in C++ hin?



  • std::regex r{"bla", std::regex_constants::icase}
    

    https://en.cppreference.com/w/cpp/regex/syntax_option_type



  • Danke, das klappt super! Allerdings wirkt es auf den kompletten regulären Ausdruck. Gibt es eine Möglichkeit, das dass Ingorieren von Groß- und Kleinschreibung sich nur auf einen Teil bezieht? Also in diesem Fall nur auf den Namen?



  • Ich glaube nicht dass das funktioniert aber probiere mal: (?i)bla. Wenn das wie erwartet mit den verschiedenen unterstützten Varianten in C++ nicht funktioniert (ECMAScript, basic, extended, awk, grep, egrep). (Änderbar wie die icase option).

    Dann fiele mir noch ein den Qt Regex zu versuchen, wie von firefly vorgeschlagen, vielleicht unterstütz der diesen marker.



  • This post is deleted!


  • Das schluckt der Compiler leider nicht:
    terminate called after throwing an instance of 'std::regex_error'
    what(): Invalid special open parenthesis.


Log in to reply