我正在使用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';
}
}
执行注释行时,将显示以下对话框:
我的代码出了什么问题?
答案 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';
}
}
输出:
答案 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
。由于此时此字符串已被破坏,所以检查失败。