Su expresión regular es incorrecta porque ninguno de los grupos de captura hace lo que desea. El primero busca hacer coincidir un solo carácter del conjunto [a-zA-Z0-9]
seguido de <space>:
, que funciona para nombres de usuario de un solo carácter, pero nada más. El segundo grupo de captura siempre estará vacío porque está buscando cero o más caracteres, pero también especificar la coincidencia no debe ser codicioso, lo que significa que una coincidencia de cero caracteres es un resultado válido.
Arreglando ambos, tu regex
se convierte
std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");
Pero simplemente instanciando un regex
y un match_results
el objeto no produce coincidencias, debe aplicar un regex
algoritmo. Dado que solo desea hacer coincidir parte de la cadena de entrada, el algoritmo apropiado para usar en este caso es regex_search
.
std::regex_search(s, matches, rgx);
Poniéndolo todo junto
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";
}
Demostración en vivo
"WEBMSG #([a-zA-Z0-9]) :(.*?)"
Esta expresión regular coincidirá solo con cadenas, que contienen un nombre de usuario de 1 carácter de longitud y cualquier mensaje después del punto y coma, pero el segundo grupo siempre estará vacío, porque intenta encontrar la coincidencia menos no codiciosa de cualquier carácter de 0 a ilimitado.
Esto debería funcionar:
"WEBMSG #([a-zA-Z0-9]+) :(.*)"