没有用于调用'regex_search(...)'的匹配函数

Sté*_*ane 7 c++ regex c++11 g++4.9

给定一个旧式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;
}
Run Code Online (Sandbox Code Playgroud)

我认为第五个带有两个迭代器的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,
Run Code Online (Sandbox Code Playgroud)

......还有更多的错误!

可以const char *转换为必要的迭代器吗?我做错了吗?我误解了这是如何工作的吗?

Pra*_*ian 10

您的代码中的错误是您使用了错误的match_results类型.smatch当你有一个std::string对象并且你将std::string::iterators 传递给regex函数时,应该使用它.当你使用原始char const *用途时cmatch.

更改

std::smatch what;
Run Code Online (Sandbox Code Playgroud)

std::cmatch what;
Run Code Online (Sandbox Code Playgroud)

现场演示