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