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