GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Regex-Gruppierung stimmt mit der C++ 11-Regex-Bibliothek überein

Ihr regulärer Ausdruck ist falsch, da keine Erfassungsgruppe das tut, was Sie wollen. Der erste sucht nach Übereinstimmungen mit einem einzelnen Zeichen aus der Menge [a-zA-Z0-9] gefolgt von <space>: , was für Benutzernamen mit nur einem Zeichen funktioniert, aber sonst nichts. Die zweite Erfassungsgruppe ist immer leer, da Sie nach null oder mehr Zeichen suchen, aber auch die Angabe der Übereinstimmung sollte nicht gierig sein, was bedeutet, dass eine Übereinstimmung mit null Zeichen ein gültiges Ergebnis ist.

Beheben Sie beides mit Ihrem regex wird

std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");

Aber einfach einen regex instanziieren und ein match_results Objekt keine Übereinstimmungen erzeugt, müssen Sie einen regex anwenden Algorithmus. Da Sie nur einen Teil der Eingabezeichenfolge abgleichen möchten, ist der geeignete Algorithmus in diesem Fall regex_search .

std::regex_search(s, matches, rgx);

Alles zusammenfügen

    std::string s{R"(
tХB:[email protected] Connected
tХB:[email protected] WEBMSG #Username :this is a message
tХB:[email protected] Status: visible
)"};

    std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");
    std::smatch matches;

    if(std::regex_search(s, matches, rgx)) {
        std::cout << "Match found\n";

        for (size_t i = 0; i < matches.size(); ++i) {
            std::cout << i << ": '" << matches[i].str() << "'\n";
        }
    } else {
        std::cout << "Match not found\n";
    }

Live-Demo


"WEBMSG #([a-zA-Z0-9]) :(.*?)"

Diese Regex passt nur auf Strings, die einen Benutzernamen mit einer Länge von 1 Zeichen und eine beliebige Nachricht nach dem Semikolon enthalten, aber die zweite Gruppe wird immer leer sein, da versucht wird, die weniger gierige Übereinstimmung von Zeichen von 0 bis unbegrenzt zu finden.

Das sollte funktionieren:

"WEBMSG #([a-zA-Z0-9]+) :(.*)"

Linux
  1. Wie führe ich Grep mit mehreren und Mustern aus?

  2. Einen Regex extrahieren, der mit „sed“ übereinstimmt, ohne die umgebenden Zeichen auszugeben?

  3. Wie werden Groß- und Kleinschreibungsmuster mit Ls abgeglichen?

  4. C++:Welche Regex-Bibliothek sollte ich verwenden?

  5. C++ Dynamic Shared Library unter Linux

Erste Schritte mit regulären Ausdrücken

10 praktische Beispiele für Regex mit grep

Probleme mit c++ IDEs unter Linux

C/C++ mit GCC:Ressourcendateien statisch zur ausführbaren Datei/Bibliothek hinzufügen

Wie verwende ich Regex mit dem Find-Befehl?

Wie verknüpfe ich die C-Laufzeitbibliothek mit 'ld'?