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

时间:2014-12-03 21:58:48

标签: 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;

输出:

a(baa)a

但我想:

a(bbb)a

4 个答案:

答案 0 :(得分:2)

以下代码是一般化的。支持 PCRE PCRE2 stl 正则表达式库

bool U::String::replaceExAll(string &s, const string& replace_this_reg_ex, const string& replace_with, bool case_sensitive, bool extended)
{
#ifdef UTIL_USE_PCRE
    pcrecpp::RE_Options options;
    options.set_utf8(true);
    options.set_caseless(!case_sensitive);
    pcrecpp::RE(replace_this_reg_ex, options).GlobalReplace(replace_with, &s);
    return true;
#elif UTIL_USE_PCRE2
    jp8::Regex re(replace_this_reg_ex);
    if(!case_sensitive)
            re.addPcre2Option(PCRE2_CASELESS).compile();

    jp8::RegexReplace& rp = re.initReplace();
    rp.setSubject(s)
                .setReplaceWith(replace_with)
                .setBufferSize(s.length() * 2);

    if(extended)
        rp.addPcre2Option(PCRE2_SUBSTITUTE_EXTENDED);
    rp.addPcre2Option(PCRE2_SUBSTITUTE_GLOBAL);
    // PCRE2_DOTALL PCRE2_MULTILINE PCRE2_UTF does not work

    s = rp.replace();
    return re.getErrorNumber() == 0;
#else
    regex rx = regex(replace_this_reg_ex, case_sensitive ? 0 : regex_constants::icase);;
    std:string temp = std::regex_replace(s, rx, replace_with);
    s = temp;

    return true;
#endif
}

for c ++ PCRE2 wrapper使用此lib:JPCRE2

答案 1 :(得分:1)

我认为您无法直接使用std::regex_replace执行此操作;它似乎没有涵盖任何相关的正则表达式格式规范。但是,你可以这样做:

std::string s = "a(aaa)a";
std::regex re("(.*\\()(a*)(\\).*)"); // Regex amended to capture all a's between ()
std::smatch m;

std::regex_search(s, m, re);
s = m.format("$1" + std::string(m[2].length(), 'b') + "$3"); // match length known here

因为除了比赛之外你真正需要知道的是你必须在那里放多少个。

答案 2 :(得分: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;

输入:

a(a a)a( a ) a"

输出:

a(b b)a( b ) a

答案 3 :(得分:0)

这可以胜任:

const std::string in = "a(aaa)a";
const std::regex re("(\\(.*?)(a)(.*\\))");

std::string out = in;
while (std::regex_search(out, re)) {
    out = std::regex_replace(out, re, "$1b$3");
}

std::cout << in << std::endl;
std::cout << out << std::endl;

输出:

a(aaa)a
a(bbb)a