2010-04-07 7 views
7

Używam Boost do dopasowywania podciągów w ciągu znaków. Io iteracyjne wyniki, muszę użyć regex_iterator().Jak używać C++ Boost's regex_iterator()

Jest to jedyny przykład użycia, który znalazłem, ale nie rozumiem oddzwaniania. Czy ktoś mógłby mi podać przykładową funkcję?


Załóżmy, że mój tekst wejściowy jest:

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

chcę uzyskać:

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

Odpowiedz

8

Jeżeli tylko część Przykładem, którego nie rozumiesz, jest oddzwanianie, pomyśl, że:

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

jest grubsza odpowiada:

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

Zakładając, że w twoim przypadku, chcesz przechowywać wszystkie mecze w wektorze, by napisać coś takiego:

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

Wielkie dzięki :) – Youssef

1

ze swojego wyjaśnienia można użyć tokenizer funkcję. I dodaj do tego więcej logiki. spojrzenie na boost::tokenizer

ex:

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:

można umieścić dowolną liczbę znaków specjalnych do separatora, jak chcesz Ex:

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

Tak to jest możliwe rozwiązanie, ale zapomniałem wspomnieć, że tekst, który naprawdę chcę pobrać, zawiera wyrazy oddzielone przez cokolwiek spacje, comas, dash, pipe ... najlepiej jest użyć wyrażeń regularnych .. boost jest najlepszy dla C++. Próbowałem użyć Boost :: regex_search(), ale zwraca tylko pierwszy mecz .. Muszę uzyskać wszystkie mecze .. dla tego powiedziano mi, aby użyć boost :: regex_iterator(), ale nie rozumiem niczego Boost dokumentacja naprawdę jest do bani ... – Youssef

+0

następnie użyj: doładowanie :: char_separator sep_1 ("*^&% ~/|"); Tokenize przeciwko wszystkim specjalnym znakom;) Po aktualizacji również – bua