正则表达式,替换所有出现的子组

Ade*_*ost 5 c++ regex replace

我想用"b"替换括号内"a"的"全部"出现.

我有:

std::string s = "a(aaa)a";
std::regex e("(\\(.*?)(a)(.*\\))");
s = std::regex_replace(s, e, "$1b$3");

std::cout << s << std::endl;
Run Code Online (Sandbox Code Playgroud)

它输出:

a(baa)a
Run Code Online (Sandbox Code Playgroud)

但我想要:

a(bbb)a
Run Code Online (Sandbox Code Playgroud)

Ade*_*ost 0

似乎唯一正确的解决方案是进行两次正则表达式搜索。一种方法是提取括号子字符串,然后对该字符串执行第二个正则表达式。

std::string in = "a(a a)a( a ) a";
std::regex re("\\(.*?\\)");
std::smatch m;
std::string out;
while (std::regex_search(in, m, re))
{
    out += m.prefix();
    std::regex re("a");
    out += std::regex_replace(m[0].str(), re, "b");
    in = m.suffix();
}
out += in;

std::cout << out << std::endl;
Run Code Online (Sandbox Code Playgroud)

输入:

a(a a)a( a ) a"
Run Code Online (Sandbox Code Playgroud)

输出:

a(b b)a( b ) a
Run Code Online (Sandbox Code Playgroud)