非捕获正则表达式与字符串的组合

Non capturing regex in combination with strings

本文关键字:字符串 组合 正则表达式      更新时间:2023-10-16

我想编写一个在字符串中搜索一个或多个单词的程序。如果找到这些词,我想用别的东西代替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;
}

我已经为我正在寻找的单词声明了变量,因为出于该程序的目的,它们来自文件。我知道有非卡普朗群的概念,但是如果我替换线

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.*ba(?:.*)b相同。您需要一个捕获组(a(.*)b)并替换为反向引用。此外,如果您计划在一行上匹配模式的多次出现,则懒惰*?可能是更好的选择(如果不是行,但处理了整个字符串,请将.替换为[sS]):

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++演示