Maison  >  Article  >  développement back-end  >  Pourquoi `std::match_results::size` renvoie-t-il 1 au lieu de 3 pour plusieurs correspondances dans une recherche d'expression régulière ?

Pourquoi `std::match_results::size` renvoie-t-il 1 au lieu de 3 pour plusieurs correspondances dans une recherche d'expression régulière ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-04 20:48:02878parcourir

Why does `std::match_results::size` return 1 instead of 3 for multiple matches in a regex search?

std::match_results::size

En C , std::match_results::size est une fonction qui renvoie le nombre de correspondances groupes plus la correspondance globale dans une recherche regex. Il est important de noter qu'il ne renvoie pas le nombre total de correspondances trouvées.

Dans l'exemple que vous avez fourni :

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

Vous vous attendiez à ce que matches.size() renvoie 3, mais à la place , vous obtenez 1. En effet, regex_search ne renvoie qu'une seule correspondance et size() renvoie le nombre de groupes de capture plus la valeur totale de la correspondance. Dans ce cas, il n'y a pas de groupe de capture, donc la taille est de 1 (la correspondance entière elle-même).

Pour obtenir plusieurs correspondances, vous pouvez utiliser std::regex_iterator, qui est démontré dans le code alternatif suivant :

<code class="cpp">std::regex rgx1("abc");
int i = 0;
smatch smtch;
while (regex_search(str, smtch, rgx1)) {
        std::cout << i << ": " << smtch[0] << std::endl;
        i += 1;
        str = smtch.suffix().str();
}</code>

Ce code détruit la chaîne d'entrée, voici donc une autre alternative utilisant std::sregex_iterator :

<code class="cpp">std::regex r("ab(c)");
std::string s = "abcdefabcghiabc";
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
                             i != std::sregex_iterator();
                             ++i)
{
        std::smatch m = *i;
        std::cout << "Match value: " << m.str() << " at Position " << m.position() << '\n';
        std::cout << "    Capture: " << m[1].str() << " at Position " << m.position(1) << '\n';
}</code>

Cette approche basée sur l'itérateur conserve la chaîne d'origine tout en vous permettant d'itérer à travers les matchs.

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:
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