非捕获正则表达式结合字符串

Non capturing regex in combination with strings

我想编写一个在字符串中搜索一个或多个单词的程序。如果找到这些词,我想用 regex_replace 替换它们,为此我们简单地说用白色 space " "。然而,我不想要的是替换可能挡在它们之间的东西。我写了以下几行(使用 Viusal Studio 2015 C++):

#include <iostream>
#include <regex>

using namespace std;

int main()
{
    string test{ "Hier drin wird gesucht und auch ersetzt." };
    string a{ "drin" };
    string b{ "auch" };
    regex r( R"(\b)" + a + R"(\b.*\b)" + b + R"(\b)");
    string result = regex_replace(test, r, " ");
    cout << result << endl;
    system("pause");

    return 0;
}

我已经为我正在寻找的单词声明了变量,因为对于这个程序来说,它们来自一个文件。我知道有非 capturng 组的概念,但是如果我替换行

    regex r( R"(\b)" + a + R"(\b.*\b)" + b + R"(\b)");

来自

    regex r( R"(\b)" + a + R"(\b(?:.*)\b)" + b + R"(\b)");

输出还是一样,即

更重要的是。

因此,尽管放置了非捕获组,但两个词之间的所有内容(包括两个词(更多词相同)都被替换了。我想我在搞砸这些团体的事情。上面的表达式我已经试过三组了,结果总是不对。

这里出了什么问题?

请注意 a.*ba(?:.*)b 相同。您需要一个 捕获组 (a(.*)b) 并替换为 backreference。此外,如果您计划在 上匹配 多个 次出现的模式(如果不是行, 但处理了整个字符串,将 . 替换为 [\s\S]):

regex r( R"(\b)" + a + R"(\b(.*?)\b)" + b + R"(\b)"); // See (.*?), capturing group
string result = regex_replace(test, r, "");  // See , backreference to Group 1 contents

C++ demo