Faire correspondre plusieurs résultats avec std::regex
Cet article traite d'un scénario dans lequel un utilisateur tente de faire correspondre chaque mot d'une chaîne donnée en utilisant le moteur d'expression régulière de la bibliothèque standard C (std::regex). L'utilisateur utilise le modèle regex "(bS*b)" pour y parvenir, mais rencontre un comportement inattendu.
Le problème
Le modèle regex initial fourni, "( bS*b)", encapsule les mots délimités par des limites de mots (b) et des caractères autres que des espaces (S). Cependant, lorsqu'il est combiné avec la fonction regex_search, ce modèle ne parvient pas à prendre en compte plusieurs correspondances potentielles dans la chaîne d'entrée.
La solution
Pour résoudre ce problème, il est nécessaire de parcourir la chaîne d'entrée tout en appliquant continuellement regex_search. Cela garantit que toutes les correspondances peuvent être détectées et capturées. Le code modifié ci-dessous illustre cette approche :
{ regex exp("(\b\S*\b)"); smatch res; string str = "first second third forth"; string::const_iterator searchStart( str.cbegin() ); while ( regex_search( searchStart, str.cend(), res, exp ) ) { cout << ( searchStart == str.cbegin() ? "" : " " ) << res[0]; searchStart = res.suffix().first; } cout << endl; }
Dans ce code révisé, un itérateur, searchStart, est initialisé au début de la chaîne d'entrée. La fonction regex_search est appelée de manière itérative, searchStart servant de position de départ de la recherche. Si une correspondance est trouvée, la correspondance est imprimée et searchStart est ajusté à la position suivant le texte correspondant. Ce processus se poursuit jusqu'à ce qu'aucune correspondance ne puisse être trouvée.
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!