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
。由于此时此字符串已被销毁,因此检查失败。
我正在用 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
。由于此时此字符串已被销毁,因此检查失败。