【问题标题】:C++ regex_search capture retrieval fails at runtimeC++ regex_search 捕获检索在运行时失败
【发布时间】:2014-08-05 04:41:30
【问题描述】:

我正在关注 Stroustrup 的 C++ 之旅 - 第 7.3.1 节(第 79 页)中的一个示例。此代码在 VS 2013 Update 3 上编译,但在运行时失败:

regex pat {R"(\w{2}\s+(\d{5}))"};
smatch matches;
if (regex_search(string{"CA 90210"}, matches, pat))
{
    if ((matches.size() > 1) && matches[1].matched)
    {
        cout << matches[1] << endl;
    }
}

知道发生了什么吗?它在matches[1] 上失败,我试图将捕获组结果输出到标准输出。我看到的运行时断言是“字符串迭代器不兼容”。

【问题讨论】:

    标签: c++ regex search match


    【解决方案1】:

    smatch 对象包含您使用正则表达式搜索的字符串的迭代器。所述字符串在您的示例中是临时的,并且在您尝试检查匹配项时已失效。所有这些迭代器都悬空。

    做起来

    string s = "CA 90210";
    if (regex_search(s, matches, pat)) {...}
    

    【讨论】:

    • +1 另一个选项 - cmatch matches; if (regex_search("CA 90210", matches, pat)) ...
    • 可能值得澄清的是 string 是临时的;措辞有点模棱两可。我困惑了几分钟,试图弄清楚smatch 怎么可能是暂时的。
    • @cdhowie: 适当澄清。
    • 那行得通。谢谢!这有点令人惊讶。我认为在条件表达式中创建的任何对象都可以在 if 语句块中访问/存在。 @Praetorian - 这是我尝试的第一件事,但它没有在 VS 2013 w/update 3 中编译。
    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 2016-08-24
    • 2017-12-30
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    相关资源
    最近更新 更多