Это довольно быстрый вопрос, я просто не смог найти его ни в документации по Boost, ни в других примерах / руководствах по регулярным выражениям Boost.
Предположим, я хочу токенизировать строку, используя эту реализацию:
boost::regex re("[\\sXY]+");
std::string s;
while (std::getline(std::cin, s)) {
boost::sregex_token_iterator i(s.begin(), s.end(), re, -1);
boost::sregex_token_iterator j;
while (i != j) {
std::cout << *i++ << " ";
}
std::cout << std::endl;
}
Проблема в том, что выражение разделителя не будет повторяться. Мне также нужна строка разделителя. Как я могу убедиться в этом?
Если я правильно понимаю, вы хотите выполнять итерации через разделители в дополнение к итерации по токенам. Разве не достаточно создать еще один итератор токенов, который будет искать токены, идентифицированные вашим регулярным выражением?
boost::sregex_token_iterator i(s.begin(), s.end(), re, -1);
boost::sregex_token_iterator j;
//now find the tokens that match the regex -> the delimiters
boost::sregex_token_iterator begin(s.begin(), s.end(), re), end;
while (i != j)
{
std::cout << *i++ << " ";
if( begin != end)
{
std::cout << "(delimiter = " << *begin++ << ") ";
}
}
Других решений пока нет …