2010-06-26 13 views
13

Se ho un semplice modello regolare come "ab." e ho una stringa che ha più corrispondenze come "abc abd". Se faccio la seguente ...Boost C++ regex - come ottenere più corrispondenze

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

Poi mcMatch contiene solo il primo risultato "abc". Come posso ottenere tutte le partite possibili?

risposta

25

È possibile utilizzare il boost::sregex_token_iterator come in questo breve esempio:

#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; 
} 

L'output di questo programma è:

abc 
abd 
+0

Grazie per la rapida risposta. Domanda, cosa ritorna * iter, non sembra essere un boost :: cmatch nel mio test rapido? Ho appena dato un esempio molto semplice. Nella mia espressione regolare posso avere gruppi, quindi ho bisogno di accedere alle informazioni del gruppo per ogni partita (come è disponibile da cmatch)? – Ron

+0

Puoi provare il regex_iterator invece, restituisce un match_result quando è dereferenziato e dovrebbe darti quello che stai cercando? – Jacob

Problemi correlati