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

标签 c++ regex regex-group

我想编写一个程序,在一个字符串中搜索一个或多个单词。如果找到这些词,我想用其他东西用 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.*ba(?:.*)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/

相关文章:

正则表达式 - 在逗号上拆分字符串,跳过平衡括号之间的任何内容

javascript - 从空格(逗号)分隔的字符串中提取单词

C++继承设计问题

c++ - 大型项目的 Emacs 教程

c++ - 类函数未在此范围内声明?

c++ - std::vector 构造函数行为

python - 正则表达式匹配字符串中可能的名称

regex - 如何从 C 在 Perl 5.12 中创建 qr//?

regex - R:通过正则表达式提取字符串匹配部分的列表

regex - 删除字符串中单个字符之间的空格