非捕获正则表达式与字符串的组合
Non capturing regex in combination with strings
我想编写一个在字符串中搜索一个或多个单词的程序。如果找到这些词,我想用别的东西代替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.*b
与a(?:.*)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++演示
相关文章:
- 组合字符串不适用于 libCurl,C++
- 如何组合一个宽字符字符串,中间插入一些空字符
- 从给定字符串中查找长度 k 的所有排列/组合
- 通过字符串迭代并将每个循环中的先前字符组合在一起
- 从左到右打印字符串的组合(不是排列)c++
- 在不使用递归的情况下求解所有 2D 字符串向量组合?(C++)
- 字符串向量的有效组合
- 将字符串转换为带有Isringstream的字符和INT(组合)
- Clang-Format:重新组合字符串文字
- 字符串二进制组合学
- 如何在 if/else 语句中组合字符串C++
- 我在 c++ 中组合了两个字符串,但放错了
- C Fstream字符串组合错误
- 如何使用for_each,transform,Iterator和lambda的某种组合将STD ::集合的字符串转换为小
- 在C++编程语言中,如何用n个向量长度的所有可能的字符串组合来填充向量
- 从字符串转换时,如何组合多个枚举
- C++组合两个以零结尾的字符串
- C++将字符串组合在一行中作为参数
- 将LPCWSTR与另一个字符串组合
- 调用枚举<<运算符进行字符串组合