2010-06-26 8 views
13

Si j'ai un motif regex simple comme "ab". et j'ai une chaîne qui a plusieurs correspondances comme "abc abd". Si je fais ce qui suit ...Boost C++ regex - comment obtenir plusieurs correspondances

boost::match_flag_type flags = boost::match_default; 
boost::cmatch mcMatch; 
boost::regex_search("abc abd", mcMatch, "ab.", flags) 

Ensuite mcMatch contient juste le premier résultat "abc". Comment puis-je obtenir toutes les correspondances possibles?

Répondre

25

Vous pouvez utiliser le boost::sregex_token_iterator comme dans cet exemple court:

#include <boost/regex.hpp> 
#include <iostream> 
#include <string> 

int main() { 
    std::string text("abc abd"); 
    boost::regex regex("ab."); 

    boost::sregex_token_iterator iter(text.begin(), text.end(), regex, 0); 
    boost::sregex_token_iterator end; 

    for(; iter != end; ++iter) { 
     std::cout<<*iter<<'\n'; 
    } 

    return 0; 
} 

La sortie de ce programme est:

abc 
abd 
+0

Merci pour la réponse rapide. Question, qu'est-ce que * iter retourne, il ne semble pas être un boost :: cmatch dans mon test rapide? Je viens de donner un exemple très simple. Dans ma regex, je peux avoir des groupes, donc j'ai besoin d'accéder aux informations de groupe pour chaque match (comme c'est disponible sur cmatch)? – Ron

+0

Vous pouvez essayer le regex_iterator à la place, il renvoie un match_result lorsqu'il est déréférencé, et devrait vous donner ce que vous cherchez? – Jacob

Questions connexes