Как использовать regex_iterator () в C ++ Boost - PullRequest
8 голосов
/ 07 апреля 2010

Я использую Boost для сопоставления подстрок в строке. Итерации по результатам, мне нужно использовать regex_iterator().

Это единственный пример использования, который я нашел, но я не понимаю обратного вызова. Может ли кто-нибудь дать мне пример использования функции?


Предположим, что мой входной текст:

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

Я хочу получить:

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

Ответы [ 2 ]

9 голосов
/ 07 апреля 2010

Если единственная часть примера, которую вы не понимаете, это обратный вызов, учтите, что:

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

примерно эквивалентно:

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

Предполагая, что в вашем случае вы хотите сохранить все совпадения в векторе, вы должны написать что-то вроде:

//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()).
}
1 голос
/ 07 апреля 2010

Из вашего объяснения Вы можете использовать функцию токенизатора. И добавьте еще немного логики. посмотрите на boost :: tokenizer

например:

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
}

редактирование:

Вы можете поместить столько специальных символов в разделитель, сколько хотите, например:

boost::char_separator<char> sep_1(" *^&%~/|");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...