C++11中regex_replace关联自定义函数问题:含判断代码失效
问题分析
你的代码存在两个核心问题:
- 替换器使用错误:你直接调用
ty("$&")并将返回值传给regex_replace,这里的"$&"是字面量字符串,并非正则匹配到的实际内容。也就是说ty接收的永远是"$&",而非你期望的"brown"。 - 正则表达式范围过大:你的正则
R"(\$(.*))"会匹配从$开始到字符串结尾的所有内容(即"$brown fox"),捕获组1的内容是"brown fox",和你判断的"brown"不相等,因此会进入else分支返回"qw"。
解决方案
修正这两个问题即可,以下是完整可运行代码:
#include <iostream> #include <regex> #include <string> std::string ty(const std::smatch& match) { // 提取第一个捕获组的内容($后面的目标字符串) std::string text = match[1].str(); if(text == "brown") return "true"; else return "qw"; } int main() { std::string text = "Quick $brown fox"; // 调整正则为匹配$后的单个单词,避免捕获过多内容 std::cout << '\n' << std::regex_replace(text, std::regex(R"(\$(\w+))"), ty) << '\n'; }
关键说明
- 正确传递替换函数:直接将
ty函数名传给regex_replace,而非调用ty的结果。regex_replace会自动为每个匹配内容调用ty,并传入包含匹配信息的std::smatch对象。 - 正则调整:使用
R"(\$(\w+))"匹配$后面的单个单词(\w+匹配字母、数字、下划线),确保捕获组1的内容是你需要判断的"brown"。 - 函数参数适配:修改
ty的参数为const std::smatch&,通过match[n].str()获取第n个捕获组的字符串内容。
运行这段代码会输出:
Quick true fox
内容的提问来源于stack exchange,提问作者nima_cpp
相关产品推荐
相关产品推荐

