表达式:使用boost regex时字符串迭代器不可解除引用

时间:2012-07-26 21:48:11

标签: c++ regex visual-c++ boost boost-regex

我想恢复页面中的所有链接,执行此代码时我得到:

  

Microsoft Visual C ++调试库

     

Debug Assertion失败!

     

程序:C:\ Users \ Gandalf \ Desktop \ proxy \ Debug \ Proxy.exe文件:   C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ xstring行:   78

     

Expression:string iterator not dereferencable

     

有关程序如何导致断言失败的信息,   请参阅关于断言的Visual C ++文档。

     

(按“重试”调试应用程序)

     

中止重试忽略

void Deltacore::Client::get_links() {
boost::smatch matches;
boost::match_flag_type flags = boost::match_default;
boost::regex URL_REGEX("^<a[^>]*(http://[^\"]*)[^>]*>([ 0-9a-zA-Z]+)</a>$");

if(!response.empty()) {

    std::string::const_iterator alfa = this->response.begin();
    std::string::const_iterator omega   = this->response.end();

    while (boost::regex_search(alfa, omega, matches, URL_REGEX))
    {
        std::cout << matches[0];
        //if(std::find(this->Links.begin(), this->Links.end(), matches[0]) != this->Links.end()) {
            this->Links.push_back(matches[0]);
        //}
        alfa = matches[0].second;
    }
}
}

任何Ideea?

添加了更多代码:

        Deltacore::Client client;
    client.get_url(target);
    client.get_links();

            boost::property_tree::ptree props;
            for(size_t i = 0; i < client.Links.size(); i++)
                props.push_back(std::make_pair(boost::lexical_cast<std::string>(i), client.Links.at(i)));

            std::stringstream ss;
            boost::property_tree::write_json(ss, props, false);

            boost::asio::async_write(socket_,
                boost::asio::buffer(ss.str(), ss.str().length()),
                boost::bind(&session::handle_write, this,
                boost::asio::placeholders::error));

提前致谢

2 个答案:

答案 0 :(得分:3)

问题在于这一行:

boost::asio::buffer(ss.str(), ss.str().length())

str()会返回一个临时 std::string对象,所以当你创建它时,你实际上是在使缓冲区失效 - 正如我所评论的那样,是vanilla UB。 ; - ]

令牌documentation citation

  

对于给定字符串对象调用的任何非const操作,缓冲区无效。

当然,销毁字符串有资格作为非const操作。

答案 1 :(得分:0)

关于使用正则表达式来解析HTML(以及你真的不应该......)的演讲,你的正则表达式看起来不会像你想要的那样工作。这是你的:

"^<a[^>]*(http://[^\"]*)[^>]*>([ 0-9a-zA-Z]+)</a>$"

第一个角色类会贪婪,吃掉你的http和以下部分。你想添加一个问号,使其不贪婪。

"^<a[^>]*?(http://[^\"]*)[^>]*>([ 0-9a-zA-Z]+)</a>$"

这可能与例外有关,也可能没有。