Использование boost :: regex_search () со строковыми итераторами

Я пытаюсь получить boost :: regex, чтобы дать мне все вхождения шаблона в строке поиска. Думал, что такие вещи будут простыми, но оставьте это для повышения и STL, чтобы добавить 10 мета-слоев обфускации шаблона поверх всего :).

Моя последняя попытка — использовать regex_search (), но, к сожалению, мой вызов не соответствует ни одной из перегрузок. Вот супер-дистиллированный пример:

std::string test = "1234567890";
boost::regex testPattern( "\\d" );
boost::match_results<std::string::const_iterator> testMatches;
std::string::const_iterator startPos = test.begin();
while( regex_search( startPos, test.end(), testMatches, testPattern ) ) {
// Do stuff: record match value, increment start position
}

Мой вызов regex_search () отключает intellisense и не компилируется («Ни один экземпляр regex_search не соответствует списку аргументов»).

Перегрузка, которую я пытаюсь вызвать:

template <class BidirectionalIterator,
class Allocator, class charT, class traits>
bool regex_search(BidirectionalIterator first, BidirectionalIterator last,
match_results<BidirectionalIterator, Allocator>& m,
const basic_regex<charT, traits>& e,
match_flag_type flags = match_default );

Который, кажется, соответствует моему вызову хорошо.

Любые идеи приветствуются! А также альтернативные способы сделать этот тип вещи. В конечном итоге я хочу разделить строку вроде:

"0.11,0.22;0.33,0.444;0.555,0.666"

В составной список строк с плавающей точкой, которые я могу затем проанализировать.

В любом другом пакете регулярных выражений это было бы просто — запустите его с помощью выражения типа «(?: ([0-9.] +) [;,]?) +», И полученные группы будут содержать результаты.

2

Решение

Проблема на самом деле в том, что вы смешиваете типы итераторов (std::string::iterator а также std::string::const_iterator, и с тех пор regex_search является функцией шаблона, неявное преобразование из iterator в const_iterator запрещено.

Вы правы в том, что декларируете test как const std::string бы исправить это, как test.end() теперь вернул бы const_iterator, вместо iterator,

Поочередно, вы можете сделать:

std::string test = "1234567890";
boost::regex testPattern( "\\d" );
boost::match_results<std::string::const_iterator> testMatches;
std::string::const_iterator startPos = test.begin();
std::string::const_iterator endPos = test.end();
while( regex_search( startPos, endPos, testMatches, testPattern ) ) {
// Do stuff: record match value, increment start position
}

Если у вас есть C ++ 11, вы также можете использовать новый std::string::cend член:

std::string test = "1234567890";
boost::regex testPattern( "\\d" );
boost::match_results<std::string::const_iterator> testMatches;
std::string::const_iterator startPos = test.begin();
while( regex_search( startPos, test.cend(), testMatches, testPattern ) ) {
// Do stuff: record match value, increment start position
}
3

Другие решения

ОК, понял это. Если искомая строка объявлена ​​как «const», метод найден правильно. Например.:

const std::string test = "1234567890";
0

По вопросам рекламы [email protected]