2013-03-24 3 views
2

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

Моя последняя попытка - использовать 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.] +) [;,]?) +», И захваченные группы будут содержать результаты ,

ответ

3

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

Вы правильно. что объявление testconst 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 
} 
+0

Cool, спасибо - я буду отмечать это как ответ, это хорошее объяснение происходящего. – QuadrupleA

+0

Рад, что вы нашли это полезным. Я знаю, что из личного опыта, отслеживающего такие «несовместимые» проблемы итератора, может быть неприятно, особенно когда код кажется правильным. Иногда я использую форму этой ошибки как вопрос интервью. –

0

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

const std::string test = "1234567890";