GNU/Linux >> Tutoriales Linux >  >> Linux

La agrupación de expresiones regulares coincide con la biblioteca de expresiones regulares de C++ 11

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

Linux
  1. ¿Cómo ejecutar Grep con patrones múltiples y?

  2. ¿Cómo hacer coincidir patrones que no distinguen entre mayúsculas y minúsculas con Ls?

  3. C++:¿qué biblioteca de expresiones regulares debo usar?

  4. Cambiar el tamaño de fuente de la terminal con C++

  5. ¿Cómo vincular la biblioteca de tiempo de ejecución de C con 'ld'?

Introducción a las expresiones regulares

10 ejemplos prácticos de expresiones regulares con grep

¿Puede Clang compilar código con GCC compilado .a libs?

Aplicación C++ de depuración remota con Eclipse GUI

si con expresiones regulares en código bash

Cambiar el nombre de los archivos en Linux con una expresión regular