GNU/Linux >> Tutoriels Linux >  >> Linux

Le regroupement Regex correspond à la bibliothèque regex C++ 11

Votre expression régulière est incorrecte car aucun groupe de capture ne fait ce que vous voulez. Le premier cherche à faire correspondre un seul caractère de l'ensemble [a-zA-Z0-9] suivi de <space>: , qui fonctionne pour les noms d'utilisateur à caractère unique, mais rien d'autre. Le deuxième groupe de capture sera toujours vide car vous recherchez zéro ou plusieurs caractères, mais spécifier également que la correspondance ne doit pas être gourmande, ce qui signifie qu'une correspondance de zéro caractère est un résultat valide.

Corriger ces deux éléments votre regex devient

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

Mais en instanciant simplement un regex et un match_results l'objet ne produit pas de correspondances, vous devez appliquer un regex algorithme. Puisque vous ne voulez faire correspondre qu'une partie de la chaîne d'entrée, l'algorithme approprié à utiliser dans ce cas est regex_search .

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

Tout mettre ensemble

    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";
    }

Démo en direct


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

Cette expression régulière ne correspondra qu'aux chaînes, qui contiennent un nom d'utilisateur d'une longueur de 1 caractère et tout message après le point-virgule, mais le deuxième groupe sera toujours vide, car essaie de trouver la correspondance la moins gourmande de tous les caractères de 0 à illimité.

Cela devrait fonctionner :

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

Linux
  1. Extraire une expression régulière correspondant à "sed" sans imprimer les caractères environnants ?

  2. aux prises avec les IDE c++ sous Linux

  3. C/C++ avec GCC :ajouter statiquement des fichiers de ressources à l'exécutable/à la bibliothèque

  4. Interface de ligne de commande C++

  5. Clang peut-il compiler du code avec des bibliothèques .a compilées par GCC ?

Initiation aux expressions régulières

Comment exécuter Grep avec plusieurs et modèles ?

Comment faire correspondre les modèles insensibles à la casse avec Ls ?

10 exemples pratiques de regex avec grep

Modifier la taille de la police du terminal avec C++

si avec regex dans le code bash