我想编写一个程序,在一个字符串中搜索一个或多个单词。如果找到这些词,我想用其他东西用 regex_replace 替换它们,为此我们简单地用空格“”说。然而,我不想要的是替换可能挡在它们之间的东西。我写了以下几行(使用 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)");
输出还是一样,即
Hier ersetzt.
因此,尽管放置了非捕获组,但两个词之间的所有内容(包括两个词(更多词相同)都会被替换。我想我在搞砸这些团体的事情。上面的表达式我已经试过三组了,结果总是不对。
这里出了什么问题?
最佳答案
请注意,a.*b
与 a(?:.*)b
相同。您需要一个捕获组 (a(.*)b
) 并替换为反向引用。此外,如果您计划在 行 上匹配 多次 出现的模式(如果不是行,但处理整个字符串,将 .
替换为 [\s\S]
):
regex r( R"(\b)" + a + R"(\b(.*?)\b)" + b + R"(\b)"); // See (.*?), capturing group
string result = regex_replace(test, r, "$1"); // See $1, backreference to Group 1 contents
参见 C++ demo
关于c++ - 非捕获正则表达式结合字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41302899/