正则表达式替换两个匹配项之间的所有匹配项

时间:2016-01-27 08:18:47

标签: c++ regex std

我正在使用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

Online regex demo

Online C++ demo

然而,如何在一次传递中替换所有三个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中的searchreplace字符串即可解决问题。

1 个答案:

答案 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>