C ++正则表达式:替换多行中的模式

时间:2016-03-19 08:52:44

标签: regex c++11

我想从带有标准C ++正则表达式库的多行字符串中删除某些行(让我们假设' aaa'' bbb')。使用ECMAScript替换语法,我将使用下一个模式:/^(aaa|bbb)$/gm。我尝试将^(aaa|bbb)$之类的内容作为正则表达式参数传递给std::regex_replace,但它无效,因为^$似乎不匹配作为开头虽然我没有将match_not_eolmatch_not_bol作为匹配标志传递,但行尾也没有结束。那么C ++模式在这种情况下应该如何?

1 个答案:

答案 0 :(得分:1)

regex_replace引用未列出任何标记以重新定义^$含义。因此,当您需要搜索和替换时,请先使用捕获组(^|\r?\n),然后使用主模式后的前瞻(?=\r?\n|$)(并使用反向引用$1替换)。当然,可以调整图案以在更换后允许或不允许空行。

请参阅IDEONE demo:

std::string s("ccc\r\naaa\r\ngggg");
std::regex ee(R"((^|\r?\n)(?:aaa|bbb)(?=\r?\n|$))");
std::string newtext = std::regex_replace( s, ee, "$1" );
std::cout << newtext << std::endl;

输出:

ccc

gggg