Maison > développement back-end > C++ > Pourquoi `std::match_results::size()` renvoie-t-il 1 pour une regex sans groupes de capture ?

Pourquoi `std::match_results::size()` renvoie-t-il 1 pour une regex sans groupes de capture ?

DDD
Libérer: 2024-11-05 02:25:01
original
421 Les gens l'ont consulté

Why does `std::match_results::size()` return 1 for a regex without capture groups?

Taille de std::match_results

Question :

Dans le code C 11 suivant , pourquoi matches.size() renvoie-t-il 1 au lieu des 3 attendus ?

<code class="cpp">#include <iostream>
#include <string>
#include <regex>

int main() {
    std::string haystack("abcdefabcghiabc");
    std::regex needle("abc");
    std::smatch matches;
    std::regex_search(haystack, matches, needle);
    std::cout << matches.size() << std::endl;
}</code>
Copier après la connexion

Réponse :

La fonction size() de std::match_results renvoie le nombre de groupes de capture plus 1, indiquant la correspondance complète. Dans ce cas, il n'y a pas de groupes de capture, donc la taille est de 1.

Explication :

La fonction regex_search trouve la première occurrence de l'expression régulière dans l'entrée chaîne. Dans ce cas, il trouve « abc » au début de la chaîne. L'objet matches contient des informations sur la correspondance, y compris les groupes de capture.

Cependant, l'expression régulière fournie ne contient aucun groupe de capture. Les groupes de capture sont des parenthèses dans l'expression régulière qui correspondent à des parties spécifiques de la chaîne d'entrée. Si des groupes de capture étaient utilisés, matches.size() renverrait le nombre de groupes de capture plus 1.

Recherche de plusieurs correspondances :

Pour rechercher plusieurs correspondances, vous pouvez utilisez une approche alternative qui itère sur les correspondances :

<code class="cpp">int main() {
    std::regex r("abc");
    std::string s = "abcdefabcghiabc";
    int i = 0;
    std::sregex_iterator it(s.begin(), s.end(), r);
    std::sregex_iterator end;
    while (it != end) {
        std::smatch m = *it;
        std::cout << i++ << ": " << m.str() << std::endl;
        it++;
    }
    return 0;
}</code>
Copier après la connexion

Ce code s'imprimera :

0: abc
1: abc
2: abc
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal