2010-04-07 5 views
7

J'utilise Boost pour faire correspondre des sous-chaînes dans une chaîne. Io itérer sur les résultats, je dois utiliser regex_iterator().Comment utiliser regex_iterator de C++ Boost()

C'est le seul exemple d'utilisation que j'ai trouvé, mais je ne comprends pas le rappel. Quelqu'un pourrait-il me donner un exemple de la fonction?


Supposons que mon texte d'entrée est:

"Hello everybody this is a sentense 
Bla bla 14 .. yes 
date 04/15/1986 
" 

Je veux obtenir:

"Hello" "everybody" "this" "is" "a" "sentense" "bla" "yes" "date" 

Répondre

8

Si la seule partie de la exemple que vous ne comprenez pas est le rappel, considérez que:

std::for_each(m1, m2, &regex_callback); 

est à peu près équivalent à:

for (; m1 != m2; ++m1){ 
    class_index[(*m1)[5].str() + (*m1)[6].str()] = (*m1).position(5); 
} 

En supposant que, dans votre cas, vous souhaitez enregistrer tous les matches dans un vecteur, vous pouvez écrire quelque chose comme:

//Warning, untested: 
boost::sregex_iterator m1(text.begin(), text.end(), expression); 
boost::sregex_iterator m2; 
std::vector<std::string> tokens; 
for (; m1 != m2; ++m1){ 
    tokens.push_back(m1->str()). 
} 
+0

Merci beaucoup :) – Youssef

1

A partir de votre explication, vous pouvez utiliser la fonction tokenizer. Et mettez plus de logique dedans. regard sur boost::tokenizer

ex:

boost::char_separator<char> sep_1(" "); 


std::string msg_copy ("Hello everybody this is a sentense Bla bla 14 .. yes date 04/15/1986 "); 
boost::tokenizer< boost::char_separator<char> > tokens(msg_copy, sep_1); 
BOOST_FOREACH(std::string t, tokens) 
{ 
     // here you itterate t 
} 

modifier:

Vous pouvez mettre autant de caractères spéciaux dans le séparateur que vous voulez ex:

boost::char_separator<char> sep_1(" *^&%~/|"); 
+0

Oui, c'est un solution possible, mais j'ai oublié de mentionner que le texte que je veux vraiment récupérer contient des mots séparés par des espaces, comas, tirets, pipe .. le meilleur est d'utiliser des expressions régulières .. boost est le meilleur pour C++. J'ai essayé d'utiliser Boost :: regex_search() mais il ne retourne que le premier match .. J'ai besoin d'obtenir tous les résultats .. pour cela on m'a dit d'utiliser boost :: regex_iterator() mais je ne comprends rien Boost's la documentation suce vraiment ... – Youssef

+0

puis utilise: boost :: char_separator sep_1 ("*^&% ~/|"); Il sera tokenize contre tous les caractères spéciaux;) Post mis à jour ainsi – bua

Questions connexes