VS2013,正则表达式。为什么我的字符串迭代器不兼容'?

时间:2015-04-30 01:56:59

标签: regex exception visual-studio-2013 iterator

我正在使用VS2013编译以下代码:

   if (std::regex_match(string("10-11-1982 11:22:31"), match, std::regex("(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2}:\\d{2})"))) {
            std::cout << "Match size:" << match.size() << std::endl;
            for (size_t i = 0; i < match.size(); ++i) {
                std::ssub_match sub_match = match[i];
                std::string piece = sub_match.str(); // <-- Interrumption here
                std::cout << "  submatch " << i << ": " << piece << '\n';
            }
        }

执行注释行时,将显示以下对话框:

enter image description here

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:1)

你不能那样使用string,虽然编译器说它没问题。

只需将输入字符串声明为string,然后将变量传递给regex_match方法。

这有效:

string line1 = "10-11-1982 11:22:31";

if (std::regex_match(line1, match, std::regex("(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2}:\\d{2})"))) {
        std::cout << "Match size:" << match.size() << std::endl;
        for (size_t i = 0; i < match.size(); ++i) {
            std::ssub_match sub_match = match[i];
            std::string piece = sub_match.str(); // <-- Interrumption here
            std::cout << "  submatch " << i << ": " << piece << '\n';
        }
    }

输出:

enter image description here

答案 1 :(得分:1)

致电时:

std::regex_match(string("10-11-1982 11:22:31"), match, std::regex("..."))

这将创建包含值std::string的临时"10-11-1982 11:22:31",并且在std::regex_match()调用返回时删除此临时字符串。

match对象在内部将迭代器保留为在其上创建对象的字符串。当您调用sub_match.str()时,将执行检查以查看这些迭代器是否仍指向有效的std::string。由于此时此字符串已被破坏,所以检查失败。