2010-06-26 16 views
13

Si tengo un patrón simple de expresiones regulares como "ab". y tengo una cadena que tiene múltiples coincidencias como "abc abd". Si hago lo siguiente ...Boost C++ regex - cómo obtener múltiples coincidencias

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

Entonces mcMatch contiene sólo el primer resultado "abc". ¿Cómo puedo obtener todas las coincidencias posibles?

Respuesta

25

Usted puede utilizar el boost::sregex_token_iterator como en este ejemplo corto:

#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 salida de este programa es:

abc 
abd 
+0

Gracias por la rápida respuesta. Pregunta, ¿qué devuelve * iter, no parece ser un impulso :: cmatch en mi prueba rápida? Acabo de dar un ejemplo muy simple. En mi expresión regular, puedo tener grupos, por lo que necesito acceder a la información del grupo para cada coincidencia (como está disponible en cmatch). – Ron

+0

Puede probar el regex_iterator en su lugar, devuelve un match_result cuando se desreferencia, y debe darle lo que está buscando. – Jacob

Cuestiones relacionadas