regex 在C++中替换第n个正则表达式匹配

6tdlim6h  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(87)

我找到了this topic,它只解释了如何替换第一个正则表达式匹配。第n场比赛怎么样?
假设我有一个字符串和一个正则表达式,如下所示:

std::string str  = "fast cast dust crust must last rust";
std::regex  expr = " .(a|u)st";

我如何用其他序列替换第三个匹配?std::regex_replace允许替换所有匹配或第一个匹配。我也在考虑std::regex_iterator,但仍然不知道如何在这个任务中应用它。解决这个问题最方便的方法是什么?

lo8azlld

lo8azlld1#

我已经想出了自己的解决办法。我使用std::string::replace从高级std::sregex_iterator中获取第一个std::sub_match中的一对迭代器:

std::string str = "fast cast dust crust must last rust";
std::regex expr{" .(a|u)st"};
std::sregex_iterator regex_it{str.cbegin(), str.cend(), expr};

std::advance(regex_it, 2);
str.replace(regex_it->cbegin()->first, regex_it->cbegin()->second, " lol");
std::cout << str << std::endl;

如果愿意,可以添加一些额外的迭代器验证。我长话短说。
输出为:

fast cast dust crust lol last rust

然而,值得一提的是,std::regex_replace返回一个修改后的副本,而上面的解决方案在原地更改了字符串。此外,应该小心,因为一旦替换完成,sub_match es中的迭代器可能会失效。

相关问题