【问题标题】:no matching function for call to ‘regex_search(...)'调用“regex_search(...)”没有匹配的函数
【发布时间】:2015-03-17 02:58:19
【问题描述】:

给定一个老式的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 * 可以转换为必要的迭代器吗?我做错了吗?我是否误解了它的工作原理?

【问题讨论】:

    标签: c++ regex c++11 g++4.9


    【解决方案1】:

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

    改变

    std::smatch what;
    

    std::cmatch what;
    

    Live demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2021-09-21
      • 2016-11-23
      • 2016-08-08
      • 2014-03-12
      • 2018-08-04
      • 2012-05-27
      相关资源
      最近更新 更多