我想用“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
答案 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