Нет соответствующей функции для вызова 'regex_search(...)'

Учитывая старый стиль const char * указатель и длина, есть ли способ позвонить std::regex_search() на нем без предварительного копирования содержимого буфера в std::string? Вот простой пример проблемы, которую я имею:

#include <regex>

int main()
{
    const char *text = "123 foobar 456";
    const size_t len = strlen(text);

    const std::regex rx(" (.+)bar");

    std::smatch what;
    std::regex_search( text, text+len, what, rx); // <- problematic line

    return 0;
}

Я думал, что мне нужен 5-й std::regex_search(), который принимает два итератора, но я не совсем понимаю, как преобразовать указатели в итераторы. Когда я пытаюсь скомпилировать код выше, я получаю это:

g++ -std=c++11 test.cpp
test.cpp:11:45: error: no matching function for call to ‘regex_search(const char*&, const char*, std::smatch&, const regex&)’
/usr/include/c++/4.9/bits/regex.h:2131:5: note: template<class _Bi_iter, class _Alloc, class _Ch_type, class _Rx_traits> bool std::regex_search(_Bi_iter, _Bi_iter, std::match_results<_BiIter, _Alloc>&, const std::basic_regex<_CharT, _TraitsT>&, std::regex_constants::match_flag_type)
 regex_search(_Bi_iter __s, _Bi_iter __e,

... и много других ошибок!

Можно const char * преобразовать в нужный итератор? Я сделал это неправильно? Я неправильно понимаю, как это работает?

1 ответ

Решение

Ошибка в вашем коде в том, что вы используете неправильный match_results тип. smatch предполагается использовать, когда у вас есть std::string объект и вы передаете std::string::iterator с regex функция. Когда у вас есть сырье char const * использование cmatch вместо.

+ Изменить

std::smatch what;

в

std::cmatch what;

Живая демо

Другие вопросы по тегам