2010-04-07 9 views
7

Estoy usando Boost para hacer coincidir subcadenas en una cadena. Io iterar sobre los resultados, necesito usar regex_iterator().Cómo usar C++ Boost's regex_iterator()

Ese es el único ejemplo de uso que he encontrado, pero no entiendo la devolución de llamada. ¿Podría alguien darme un ejemplo de uage de la función?


Supongamos que mi texto de entrada es:

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

quiero llegar:

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

Respuesta

8

Si la única parte de la ejemplo que no entiende es la devolución de llamada, considere que:

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

es más o menos equivalente a:

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

Suponiendo que, en su caso, que desea almacenar todos los partidos en un vector, podría escribir algo como:

//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

Muchas gracias :) – Youssef

1

Desde su explicación Es posible utilizar tokenizer función. Y agrega algo más de lógica. vistazo a boost::tokenizer

ejemplo:

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 
} 

edición:

Usted puede poner tantos caracteres especiales al separador que desee por ejemplo:

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

Sí Esto es una posible solución, pero olvidé mencionar que el texto que realmente quiero buscar contiene palabras separadas por espacios de cualquier cosa, comas, dashs, pipe ... lo mejor es usar expresiones regulares. boost es lo mejor para C++. He intentado usar Boost :: regex_search() pero solo devuelve la primera coincidencia ... necesito obtener todas las coincidencias ... por eso me dijeron que use boost :: regex_iterator() pero no entiendo nada Boost's la documentación realmente apesta ... – Youssef

+0

luego usa: boost :: char_separator sep_1 ("*^&% ~/|"); Tokenizará contra todos los caracteres especiales;) Publicación actualizada también – bua