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]+) :(.*)"