Maison > développement back-end > C++ > le corps du texte

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
Libérer: 2024-11-04 20:48:02
original
876 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!