为何std::regex_search无法匹配正确重载?VS2017编译报错
解决Visual Studio 2017中std::regex_search的匹配错误
兄弟,我一眼就瞅出你代码里的核心问题了——std::match_results的模板参数用错了,咱们一步步捋清楚:
你当前代码里用的是std::match_results<char>,但这个模板类的参数要求是迭代器类型,不是单纯的字符类型。因为你传给std::regex_search的第一个参数是字符串字面量"This is a test.",它的实际类型是const char*,所以对应的match_results必须用const char*作为模板参数才能匹配重载。
修正后的代码(直接适配你的原始写法)
#include <regex> #include <iostream> int main() { std::basic_regex<char> rx("This"); std::match_results<const char*> mat; // 这里把char改成const char* const char* str = "This is a test."; bool match_success = std::regex_search(str, mat, rx, std::regex_constants::match_continuous); // 加个输出验证匹配结果 if (match_success) { std::cout << "匹配成功: " << mat[0] << std::endl; } else { std::cout << "匹配失败" << std::endl; } return 0; }
更符合C++习惯的写法(用std::string简化)
如果用std::string来存储输入字符串,还可以用std::smatch这个别名(它是std::match_results<std::string::const_iterator>的简写),代码会更简洁:
#include <regex> #include <iostream> #include <string> int main() { std::regex rx("This"); // 等价于std::basic_regex<char> std::smatch mat; // 专门用于std::string的匹配结果存储 std::string str = "This is a test."; bool match_success = std::regex_search(str, mat, rx, std::regex_constants::match_continuous); if (match_success) { std::cout << "匹配成功: " << mat[0] << std::endl; } else { std::cout << "匹配失败" << std::endl; } return 0; }
这两种写法都能正确匹配到字符串开头的"This",解决你之前遇到的编译器错误。
内容的提问来源于stack exchange,提问作者Mark Ransom
相关产品推荐
相关产品推荐

