Maison >développement back-end >C++ >Combien d'éléments std::match_results::size() renvoie-t-il en C ?
Que renvoie std::match_results::size() ?
En C 11, std::match_results::size( ) renvoie le nombre de groupes de capture dans un objet de résultat de correspondance plus un (la valeur de correspondance entière).
Considérez ce qui suit code :
<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>
Ce code trouve la première occurrence de la sous-chaîne "abc" dans la chaîne "abcdefabcghiabc" et stocke le résultat de la correspondance dans l'objet matches. Étonnamment, l'appel de matches.size() renvoie 1 au lieu de 3 (le nombre attendu de correspondances).
Ce comportement s'explique par le fait que regex_search() ne renvoie qu'une seule correspondance et que size() inclut à la fois le match et tous les groupes de capture. Dans ce cas, il n'y a pas de groupes de capture, donc size() renvoie 1 (correspondance complète uniquement).
Recherche de plusieurs correspondances
Pour rechercher et compter plusieurs correspondances, utilisez std::sregex_iterator ou std::wsregex_iterator (pour les chaînes de caractères larges). Voici un exemple utilisant std::sregex_iterator :
<code class="cpp">#include <iostream> #include <string> #include <regex> using namespace std; int main() { std::regex r("abc"); std::string s = "abcdefabcghiabc"; int count = 0; for (std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); i != std::sregex_iterator(); ++i) { count++; } cout << "Number of matches: " << count << endl; }</code>
Ce code parcourt toutes les correspondances de "abc" dans la chaîne et les compte.
Capturer les groupes
Si votre expression régulière contient des groupes de capture (sous-expressions entre parenthèses), la taille du résultat de la correspondance inclura les groupes de capture aussi. Par exemple, si vous avez une expression régulière qui correspond à "abc(def)" et que la chaîne d'entrée contient "abcdef", la taille du résultat de la correspondance sera de 2 (correspondance complète et groupe de capture "def").
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!