Это не столько ответ, сколько попытка восстановить то, что вы делаете.Я делаю простой круговой буфер, инициализированный из строки, и я просматриваю совпадения регулярных выражений через этот буфер и печатаю соответствующие диапазоны.Кажется, все работает нормально.
Я бы не рекомендовал хранить сами диапазоны в кольцевом буфере;или, по крайней мере, диапазоны должны храниться в парах.
Вот мой тестовый код:
#include <iostream>
#include <string>
#include <boost/circular_buffer.hpp>
#include <boost/regex.hpp>
#include "prettyprint.hpp"
typedef boost::circular_buffer<char> cb_char;
typedef boost::regex_iterator<cb_char::iterator> cb_char_regex_it;
int main()
{
std::string sample = "Hello 12 Worlds 34 ! 56";
cb_char cbc(8, sample.begin(), sample.end());
std::cout << cbc << std::endl; // (*)
boost::regex expression("\\d+"); // just match numbers
for (cb_char_regex_it m2, m1(cbc.begin(), cbc.end(), expression); m1 != m2; ++m1)
{
const auto & mr = *m1;
std::cout << "--> " << mr << ", range ["
<< std::distance(cbc.begin(), mr[0].first) << ", "
<< std::distance(cbc.begin(), mr[0].second) << "]" << std::endl;
}
}
(При этом используется симпатичный принтер для печати необработанного проспектабуфер; вы можете удалить строку, помеченную (*)
.)
Обновление: вот один из возможных способов сохранить совпадения:
typedef std::pair<std::size_t, std::size_t> match_range;
typedef std::vector<match_range> match_ranges;
/* ... as before ... */
match_ranges ranges;
for (cb_char_regex_it m2, m1(cbc.begin(), cbc.end(), expression); m1 != m2; ++m1)
{
const auto & mr = *m1;
ranges.push_back(match_range(std::distance(cbc.begin(), mr[0].first), std::distance(cbc.begin(), mr[0].second)));
std::cout << "--> " << mr << ", range " << ranges.back() << std::endl;
}
std::cout << "All matching ranges: " << ranges << std::endl;