求助:C++调用regex_match函数报‘no matching function for call to 'regex_match'’错误的原因
问题原因及解决办法
嘿,我一眼就揪出问题所在啦!你碰到的no matching function for call to 'regex_match'错误,核心原因是传递给正则函数的参数类型不匹配。
错误根源
你在循环里写的regex_match(str[i], r),这里的str[i]是单个char类型的字符,但C++标准库的std::regex_match和std::regex_search函数,根本不接受单个char作为匹配目标。它们需要的是完整的字符串对象(std::string)、C风格字符串(const char*),或者一对迭代器来指定一段字符序列的范围。
额外的逻辑小漏洞
顺便提一句,你当前的循环逻辑也有问题:每次循环都会覆盖b的值,最后b只会保留最后一个字符的判断结果。如果你的需求是「所有字符都必须属于a-m或者N-Z才输出YES」,那这个逻辑完全不对——应该初始把b设为true,只要遇到不符合的字符就把b改成false并跳出循环,这样才符合预期。
修正后的代码
下面是修复后的代码,我提供两种处理单个字符匹配的方式:
方式1:将单个char转换为string
#include <iostream> #include <string> #include <regex> using namespace std; int main () { int t; cin>>t; // 单个字符的话,正则可以简化成[a-m],^和$其实多余,但保留也不影响匹配结果 regex r("[a-m]"); regex r2("[N-Z]"); while(t--) { int k; cin>>k; string str; cin>>str; bool b = true; for(int i=0;i<k;i++) { // 把单个char包装成string对象 string single_char(1, str[i]); if (!(regex_match(single_char, r) || regex_match(single_char, r2))) { b = false; break; // 发现不符合的字符,直接终止检查 } } cout << (b ? "YES" : "NO") << endl; } return 0; }
方式2:使用迭代器指定单个字符范围
这种方式不需要额外创建string,效率更高:
#include <iostream> #include <string> #include <regex> using namespace std; int main () { int t; cin>>t; regex r("[a-m]"); regex r2("[N-Z]"); while(t--) { int k; cin>>k; string str; cin>>str; bool b = true; for(int i=0;i<k;i++) { // 用迭代器表示当前字符到下一个字符的范围 if (!(regex_match(str.begin()+i, str.begin()+i+1, r) || regex_match(str.begin()+i, str.begin()+i+1, r2))) { b = false; break; } } cout << (b ? "YES" : "NO") << endl; } return 0; }
简化小技巧
如果你想让代码更简洁,还可以把两个正则合并成一个:regex r("[a-mN-Z]"),这样只需要一次匹配判断就够了~
内容的提问来源于stack exchange,提问作者Tanishka
相关产品推荐
相关产品推荐

