Учитывая старый стиль 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 станд :: 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 *
преобразовать в нужный итератор? Я сделал это неправильно? Я неправильно понимаю, как это работает?
Ошибка в вашем коде в том, что вы используете неправильный match_results
тип. smatch
предполагается использовать, когда у вас есть std::string
объект и вы передаете std::string::iterator
с regex
функция. Когда у вас есть сырье char const *
использование cmatch
вместо.
+ Изменить
std::smatch what;
в
std::cmatch what;