我正在使用std::regex
,需要进行搜索和替换。
我的字符串是:
begin foo even spaces and maybe new line(
some text only replace foo foo bar foo, keep the rest
)
some more text not replace foo here
只应触及begin .... (
和)
之间的内容。
我设法使用此搜索替换第一个foo并替换:
(begin[\s\S]*?\([\s\S]*?)foo([\s\S]*?\)[\s\S]*)
$1abc$2
然而,如何在一次传递中替换所有三个foo?我尝试了外观,但因为量词而失败。
最终结果应如下所示:
begin foo even spaces and maybe new line(
some text only replace abc abc bar abc, keep the rest
)
some more text not replace foo here
问题更新:
我正在寻找纯正的正则表达式解决方案。也就是说,只需更改the online C++ demo中的search
和replace
字符串即可解决问题。
答案 0 :(得分:0)
我已经提出了这段代码(基于Benjamin Lindley's answer):
#include <iostream>
#include <regex>
#include <string>
int main()
{
std::string input_text = "my text\nbegin foo even 14 spaces and maybe \nnew line(\nsome text only replace foo foo bar foo, keep the rest\n)\nsome more text not replace foo here";
std::regex re(R"((begin[^(]*)(\([^)]*\)))");
std::regex rxReplace(R"(\bfoo\b)");
std::string output_text;
auto callback = [&](std::string const& m){
std::smatch smtch;
if (regex_search(m, smtch, re)) {
output_text += smtch[1].str();
output_text += std::regex_replace(smtch[2].str().c_str(), rxReplace, "abc");
} else {
output_text += m;
}
};
std::sregex_token_iterator
begin(input_text.begin(), input_text.end(), re, {-1,0}),
end;
std::for_each(begin,end,callback);
std::cout << output_text;
return 0;
}
请参阅IDEONE demo
我正在使用一个正则表达式来查找begin...(....)
的所有匹配项,并将它们传递给回调函数,其中只进一步处理第2组(\bfoo\b
正则表达式用于替换foo
s与abc
s)。
我建议使用(begin[^(]*)(\([^)]*\))
正则表达式:
(begin[^(]*)
- 与字符序列begin
匹配的第1组,后跟除(
以外的零个或多个字符(\([^)]*\))
- 第2组与文字(
匹配,后跟除)
([^)]*
)和文字)
以外的零个或多个字符。< / LI>