Váš regulární výraz je nesprávný, protože žádná zachytávací skupina nedělá to, co chcete. První se snaží najít shodu s jedním znakem ze sady [a-zA-Z0-9]
následuje <space>:
, který funguje pro jednoznaková uživatelská jména, ale nic jiného. Druhá skupina zachycení bude vždy prázdná, protože hledáte nula nebo více znaků, ale také určení shody by nemělo být zištné, což znamená, že shoda nula znaků je platným výsledkem.
Oprava obou těchto vašich regex
se stává
std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");
Ale stačí vytvořit instanci regex
a match_results
objekt nevytváří shody, musíte použít regex
algoritmus. Protože chcete porovnat pouze část vstupního řetězce, je v tomto případě vhodný algoritmus regex_search
.
std::regex_search(s, matches, rgx);
Dát to všechno dohromady
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";
}
Živá ukázka
"WEBMSG #([a-zA-Z0-9]) :(.*?)"
Tento regulární výraz bude odpovídat pouze řetězcům, které obsahují uživatelské jméno o délce 1 znaku a jakoukoli zprávu za středníkem, ale druhá skupina bude vždy prázdná, protože se snaží najít méně nenasytnou shodu libovolných znaků od 0 do neomezeně.
Mělo by to fungovat:
"WEBMSG #([a-zA-Z0-9]+) :(.*)"