非捕获正则表达式结合字符串
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.*b
与 a(?:.*)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
我想编写一个在字符串中搜索一个或多个单词的程序。如果找到这些词,我想用 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.*b
与 a(?:.*)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