Maison > Article > développement back-end > Pourquoi `std::match_results::size` renvoie-t-il 1 au lieu de 3 pour plusieurs correspondances dans une recherche d'expression régulière ?
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>
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>
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>
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!