0Pricing
C++ Academy · Aula

Grupos de captura

Extraia partes correspondentes

Grupos de captura é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

O que é um grupo de captura?

Parênteses em um padrão criam um grupo de captura, que memoriza a parte do texto correspondente para que você possa extraí-la depois.

  • (\\d+) captura uma sequência de dígitos.
  • Os resultados são armazenados em um std::smatch.
#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d+)");
    std::smatch m;
    std::string s = "order 42";
    if (std::regex_search(s, m, p)) {
        std::cout << "Captured: " << m[1] << '\n';
    }
    return 0;
}

O resultado de smatch

std::smatch armazena os resultados da correspondência. O índice [0] é a correspondência inteira, enquanto [1], [2] e assim por diante são os grupos de captura na ordem.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\w+)@(\\w+)");
    std::smatch m;
    std::string s = "user@host";
    if (std::regex_search(s, m, p)) {
        std::cout << "Whole: " << m[0] << '\n';
        std::cout << "User: " << m[1] << ", Host: " << m[2] << '\n';
    }
    return 0;
}

Vários grupos

Você pode capturar várias partes de uma só vez, por exemplo, separando uma data em ano, mês e dia.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d{4})-(\\d{2})-(\\d{2})");
    std::smatch m;
    std::string s = "2026-05-30";
    if (std::regex_match(s, m, p)) {
        std::cout << "Y=" << m[1] << " M=" << m[2] << " D=" << m[3] << '\n';
    }
    return 0;
}

str(), position() e comprimento

Cada grupo oferece str() para seu texto, position() para seu deslocamento e length() para seu tamanho dentro da entrada.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d+)");
    std::smatch m;
    std::string s = "abc 789 xyz";
    if (std::regex_search(s, m, p)) {
        std::cout << "str: " << m[1].str() << '\n';
        std::cout << "pos: " << m.position(1) << '\n';
        std::cout << "len: " << m.length(1) << '\n';
    }
    return 0;
}

prefix e suffix

O objeto de correspondência também disponibiliza prefix() (o texto antes da correspondência) e suffix() (o texto depois dela).

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\d+");
    std::smatch m;
    std::string s = "left 55 right";
    if (std::regex_search(s, m, p)) {
        std::cout << "prefix: [" << m.prefix() << "]\n";
        std::cout << "suffix: [" << m.suffix() << "]\n";
    }
    return 0;
}

Grupos sem captura

Use (?:...) para agrupar sem capturar. Assim, seus grupos numerados continuam significativos quando você precisa agrupar apenas para aplicar quantificadores ou alternância.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(?:Mr|Ms) (\\w+)");
    std::smatch m;
    std::string s = "Ms Smith";
    if (std::regex_search(s, m, p)) {
        std::cout << "Name: " << m[1] << '\n';
    }
    return 0;
}

Verificando se um grupo correspondeu

Um grupo opcional pode não participar de uma correspondência. Verifique matched na subcorrespondência para saber se ele capturou algo.

#include <iostream>
#include <regex>

int main() {
    std::regex p("file(\\.txt)?");
    std::smatch m;
    std::string s = "file";
    if (std::regex_match(s, m, p)) {
        std::cout << std::boolalpha << "ext matched: " << m[1].matched << '\n';
    }
    return 0;
}

Percorrendo todas as correspondências

std::sregex_iterator percorre todas as correspondências em uma cadeia, fornecendo cada grupo durante o percurso.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d+)");
    std::string s = "a1 b22 c333";
    auto begin = std::sregex_iterator(s.begin(), s.end(), p);
    auto end = std::sregex_iterator();
    for (auto it = begin; it != end; ++it) {
        std::cout << (*it)[1] << '\n';
    }
    return 0;
}

Contagem de correspondências

Combine o iterador com std::distance para contar quantas vezes um padrão ocorre.

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\d+");
    std::string s = "1 22 333 4444";
    auto begin = std::sregex_iterator(s.begin(), s.end(), p);
    auto end = std::sregex_iterator();
    std::cout << "Count: " << std::distance(begin, end) << '\n';
    return 0;
}

Extração de pares de chave e valor

Dois grupos por correspondência permitem analisar texto estruturado simples, como os elementos key=value.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\w+)=(\\w+)");
    std::string s = "a=1 b=2 c=3";
    auto begin = std::sregex_iterator(s.begin(), s.end(), p);
    auto end = std::sregex_iterator();
    for (auto it = begin; it != end; ++it) {
        std::cout << (*it)[1] << " -> " << (*it)[2] << '\n';
    }
    return 0;
}

Armazenamento de capturas

Copie uma subcorrespondência capturada para uma std::string com str(), para que os dados continuem válidos depois que o objeto de correspondência for destruído.

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::regex p("v(\\d+)");
    std::smatch m;
    std::string s = "version v7";
    std::string version;
    if (std::regex_search(s, m, p)) {
        version = m[1].str();
    }
    std::cout << "Stored: " << version << '\n';
    return 0;
}

Verificação rápida

Verifique sua compreensão da indexação de grupos de captura.

Recapitulação

Você aprendeu a extrair dados com grupos de captura:

  • parênteses capturam; (?:...) agrupa sem capturar
  • smatch[0] é a correspondência inteira; [1] em diante são os grupos
  • str(), position(), length(), prefix(), suffix()
  • sregex_iterator percorre todas as correspondências

Em seguida, você transformará texto usando pesquisa e substituição.

Perguntas Frequentes

A aula “Grupos de captura” é grátis?

Sim — o texto completo de “Grupos de captura” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “Grupos de captura”?

Extraia partes correspondentes Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Grupos de captura”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Noções básicas de regex
  2. Grupos de captura
  3. Pesquisa e substituição
  4. Observações sobre desempenho
← Voltar para C++ Academy