Maison > développement back-end > C++ > Pourquoi `std::match_results::size` ne renvoie-t-il pas le nombre de correspondances dans une chaîne ?

Pourquoi `std::match_results::size` ne renvoie-t-il pas le nombre de correspondances dans une chaîne ?

Barbara Streisand
Libérer: 2024-11-07 22:16:02
original
858 Les gens l'ont consulté

Why does `std::match_results::size` not return the number of matches in a string?

Que renvoie std::match_results::size, et pourquoi ne correspond-il pas au nombre de correspondances ?

Le std La fonction ::match_results::size en C 11 renvoie le nombre de groupes de capture plus un pour la valeur de correspondance entière. Dans le code 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;
}
Copier après la connexion

vous pouvez vous attendre à ce que le résultat soit 3, puisque la chaîne "abc" apparaît trois fois dans la botte de foin. Cependant, la sortie est en réalité 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 groupes de capture, donc size() renvoie 1 pour toute la valeur de correspondance. Si vous souhaitez trouver toutes les correspondances de "abc" dans la botte de foin, vous pouvez utiliser la fonction std::regex_search avec plusieurs paramètres :

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

Ce code recherchera dans la botte de foin toutes les correspondances de "abc" et stockez-les dans le vecteur matches. La fonction size() renverra alors le nombre de correspondances trouvées, qui est 3 dans ce cas.

Solutions alternatives

Il existe d'autres méthodes pour trouver plusieurs correspondances dans une chaîne. Une méthode consiste à utiliser std::sregex_iterator :

<code class="cpp">int main() {
    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';
    }
    return 0;
}
Copier après la connexion

Ce code renverra :

Match value: abc at Position 0
    Capture: c at Position 2
Match value: abc at Position 6
    Capture: c at Position 8
Match value: abc at Position 12
    Capture: c at Position 14
Copier après la connexion

Une autre méthode consiste à utiliser la fonction std::regex_match :

<code class="cpp">int main() {
    std::regex r("abc");
    std::string s = "abcdefabcghiabc";
    std::vector<std::string> matches;
    std::smatch match;
    while (std::regex_search(s, match, r)) {
        matches.emplace_back(match[0]);
        s = match.suffix().str();
    }
    std::cout << matches.size() << std::endl;
}</code>
Copier après la connexion

Ce code renverra également 3.

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