Faire correspondre plusieurs résultats avec std::regex
Faire correspondre plusieurs résultats à l'aide de std::regex peut être un moyen pratique d'extraire plusieurs morceaux de les données d’une chaîne en une seule opération. Cependant, l'expression régulière fournie "(bS*b){0,}" ne convient pas pour faire correspondre tous les mots de la chaîne "premier deuxième tiers".
Solution :
Le problème avec l'expression régulière d'origine est que le quantificateur {0,} correspond à zéro ou plusieurs fois, ce qui permet au modèle de correspondre à des chaînes vides. Au lieu de cela, un quantificateur qui correspond une ou plusieurs fois, tel que "{1,}" ou " ", doit être utilisé.
De plus, pour faire correspondre chaque mot de la chaîne, l'expression régulière doit être appliquée à plusieurs reprises. , en recherchant à chaque fois à partir de la position après le match précédent. Ceci peut être réalisé en utilisant une boucle avec regex_search itérant sur la chaîne.
Code révisé :
Voici un code révisé qui implémente les modifications nécessaires :
#include <iostream> #include <string> #include <regex> using namespace std; int main() { 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; }
Ce code applique de manière itérative l'expression régulière à la chaîne et génère chaque mot correspondant séparé par des espaces. Le résultat sera :
first second third forth
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!