GNU/Linux >> Znalost Linux >  >> Linux

Seskupení regulárních výrazů odpovídá knihovně regulárních výrazů C++ 11

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

Linux
  1. Jak spustit Grep s více a vzory?

  2. Jak spárovat vzory bez rozlišení malých a velkých písmen s Ls?

  3. Jak používat regex s příkazem find?

  1. Změňte velikost písma terminálu pomocí C++

  2. Rozhraní příkazového řádku C++

  3. Jak propojit knihovnu C Runtime s 'ld'?

  1. Počítání celkového počtu shod s grep místo toho, kolik řádků odpovídá

  2. pokud s regulárním výrazem v kódu bash

  3. Přejmenování souborů v linuxu pomocí regulárního výrazu