为什么C++中使用正则反向引用的字符串提取函数结果不符合预期?
问题原因
你的错误出在extractStr函数对std::smatch的遍历逻辑:std::smatch的元素列表中,m[0]是正则表达式匹配到的完整子串,从m[1]开始依次对应正则里定义的各个捕获分组的匹配结果。你将所有元素全部拼接返回,相当于把完整匹配结果和所有捕获分组的内容叠加到了一起,就会出现多余的重复字符。
比如你测试的第二条正则(\\d)\\+\\1,匹配后m[0]是1+1,m[1]是捕获分组匹配到的1,拼接后就得到了你输出的1+11,完全符合你遇到的现象。
修复方案
你只需要取m[0]即完整匹配结果返回即可,修改后的函数如下:
string extractStr(string str, string regExpStr) { regex regexp(regExpStr); smatch m; if (regex_search(str, m, regexp)) { return m.str(0); } return ""; // 匹配失败返回空,可根据需求调整返回逻辑 }
验证结果
修改后运行你的测试代码,输出符合预期:
n+n 1+1 n+n n+n
如果你的业务需求是拼接所有捕获分组的内容而非取完整匹配,遍历m的时候从索引1开始即可。
内容的提问来源于stack exchange,提问作者cerebrus6
相关产品推荐
相关产品推荐

