Maison > développement back-end > C++ > Comment `std::match_results::size()` détermine-t-il le nombre de correspondances dans une expression régulière ?

Comment `std::match_results::size()` détermine-t-il le nombre de correspondances dans une expression régulière ?

Mary-Kate Olsen
Libérer: 2024-11-04 12:43:02
original
269 Les gens l'ont consulté

How does `std::match_results::size()` determine the number of matches in a regular expression?

Détermination de la taille des correspondances Regex avec std::match_results::size()

std::match_results::size() fournit des informations sur le nombre de groupes de correspondance et la valeur complète de la correspondance dans une correspondance regex. Examinons ses fonctionnalités.

Dans le code C 11, std::match_results::size() est utilisé pour obtenir des informations sur les correspondances d'expressions régulières. Il renvoie un décompte qui inclut la correspondance entière ainsi que tous les groupes de capture qui peuvent avoir été spécifiés dans l'expression régulière. Cependant, la valeur qu'il fournit peut différer du nombre de correspondances attendu.

Considérons l'exemple suivant :

<code class="cpp">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

Dans ce cas, vous pourriez espérer obtenir un résultat de 3 correspondances. Cependant, vous n’en recevrez qu’un car regex_search() ne récupère qu’une seule correspondance. La fonction size() rapporte le nombre de groupes de capture ainsi que la correspondance entière.

Pour clarifier, std::match_results contient les détails de la correspondance et toutes les sous-correspondances découvertes. Si une recherche d'expression régulière réussit, elle ne sera pas vide. Il contient une série d'objets sub_match, le premier représentant la correspondance complète. D'autres objets sub_match dans l'objet match_results correspondent à des sous-groupes au sein de l'expression regex (indiqués par des parenthèses).

Par exemple, considérons l'expression régulière suivante :

<code class="cpp">"ab(c)"</code>
Copier après la connexion

Il a un groupe de capture qui piège le caractère « c ». Le code suivant utilise std::regex_iterator pour trouver plusieurs correspondances, protégeant ainsi contre la destruction de chaînes :

<code class="cpp">std::string str("abcdefabcghiabc");
std::regex rgx1("abc");
smatch smtch;
while (regex_search(str, smtch, rgx1)) {
    std::cout << smtch[0] << std::endl;
    str = smtch.suffix().str();
}</code>
Copier après la connexion

Ce code imprime "abc" trois fois.

Alternativement, std::sregex_iterator peut être utilisé, fournissant une méthode plus efficace et préservant les chaînes :

<code class="cpp">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() << "\n";
    std::cout << "    Capture: " << m[1].str() << "\n";
}</code>
Copier après la connexion

Ce code imprime la correspondance complète et capture les valeurs, offrant une compréhension approfondie du comportement de std::match_results::size().

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