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
389 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!

source:php.cn
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