2010-04-07 13 views
7

Sto usando Boost per far corrispondere le sottostringhe in una stringa. Io continuo i risultati, ho bisogno di usare regex_iterator().Come usare rexx_iterator di C++ Boost()

Questo è l'unico esempio di utilizzo che ho trovato, ma non capisco il callback. Qualcuno potrebbe darmi un esempio di questa funzione?


Supponiamo che il mio testo di input è:

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

voglio ottenere:

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

risposta

8

Se l'unica parte del esempio che non si capisce è il callback, si consideri che:

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

è più o meno equivalente a:

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

Supponendo che, nel suo caso, si desidera memorizzare tutte le partite in un vettore, si potrebbe scrivere qualcosa di simile:

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

Grazie mille :) – Youssef

1

Dalla tua spiegazione è possibile utilizzare la funzione tokenizer. E aggiungici un po 'di logica. sguardo boost::tokenizer

es:

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 
} 

edit:

Si può mettere il maggior numero di caratteri speciali al separatore come si vuole es:

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

Sì, questo è un possibile soluzione, ma ho dimenticato di menzionare che il testo che voglio veramente recuperare contiene parole separate da qualsiasi spazio, coma, trattino, pipe .. il migliore è usare le espressioni regolari .. boost è il migliore per C++. Ho provato a utilizzare Boost :: regex_search() ma restituisce solo la prima corrispondenza .. ho bisogno di ottenere tutte le corrispondenze .. per questo mi è stato detto di usare boost :: regex_iterator() ma non capisco nulla di Boost's la documentazione fa davvero schifo ... – Youssef

+0

quindi utilizzare: boost :: char_separator sep_1 ("*^&% ~/|"); Sarà tokenize contro tutti i caratteri speciali;) Post aggiornato anche – bua

Problemi correlati