VS2013,正则表达式。为什么我得到 'string iterators incompatible'?

VS2013, regex. Why do I get 'string iterators incompatible'?

我正在用 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';
            }
        }

执行注释行时会出现以下对话框:

我的代码有什么问题?

你不能那样使用 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';
        }
    }

输出:

当你打电话时:

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

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

match 对象在内部将迭代器保存到创建它的字符串。当您调用 sub_match.str() 时,会执行检查以查看这些迭代器是否仍指向有效的 std::string。由于此时此字符串已被销毁,因此检查失败。