你的代码目前在每次匹配时都会对整个字符串进行替换,这会导致重复替换之前的匹配项,从而出现所有替换结果相同的情况。要让字符串中的每个匹配项逐个替换并递增,可以使用以下改进方案:
#include <iostream>
#include <regex>
#include <string>
std::string replace_and_increment(std::string input, std::regex pattern) {
std::string result;
std::sregex_iterator currentMatch(input.begin(), input.end(), pattern);
std::sregex_iterator lastMatch;
size_t previousEnd = 0;
while (currentMatch != lastMatch) {
std::smatch match = *currentMatch;
// 把每个匹配前的部分加上
result += input.substr(previousEnd, match.position() - previousEnd);
// 去掉括号得到数字字符串
std::string matchStr = match.str().substr(1, match.length() - 2);
int num = std::stoi(matchStr);
num++;
// 将新的数字添加到结果中
result += "(" + std::to_string(num) + ")";
previousEnd = match.position() + match.length();
++currentMatch;
}
// 别忘了加上最后一个匹配后面的字符串
result += input.substr(previousEnd);
return result;
}
int main() {
std::string input = "\n(2)333\n(3)444";
std::regex pattern("\\(\\d+\\)");
std::string result = replace_and_increment(input, pattern);
std::cout << result << std::endl;
return 0;
}
这里的关键是通过`previousEnd`变量来记录上一次匹配结束的位置,从而逐步更新字符串。在每次匹配时,只替换当前位置匹配到的字符串,并更新结果字符串。这样就避免了对整个字符串的多重替换。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |