正则表达式中cirlce bracets的正则表达式错误

时间:2019-03-30 12:35:09

标签: c++ regex

我正在尝试删除字符串中所有“:-)+ | ::-(+”的实例,但是编译器一直在给我regex错误

我尝试使用regex_constants :: basic,将正则表达式切换为“:-)+ |:-(+”,并切换至MinGW的c ++ 14版本

string a;
cin>>a;
regex r(":-\)+|:-\(+",regex_constants::basic);
cout << regex_replace(a, r, "");

上面的代码甚至在IDE中以“未知转义序列“ \)”“突出显示。

1 个答案:

答案 0 :(得分:2)

要删除诸如:-)))):-(((之类的字符串,请使用

std::string a("Text:-) :-(((here");
std::regex r(":-\\)+|:-\\(+");      // Or std::regex r(R"(:-\)+|:-\(+)");
std::cout << regex_replace(a, r, "") << std::endl;
// => Text here

请参见C++ demo

有两个问题:

  • "\("创建了无效的字符串转义序列,因此会出错。要形成正则表达式转义序列,(之前的反斜杠必须为文字反斜杠,并且要定义文字反斜杠,请使用"\\"R"(\)"。 / li>
  • 通过指定regex_constants::basic标志,您需要引擎将您的表达式解析为POSIX BRE正则表达式,这使您的模式无效(如果转义了),因为\(\)是用于形成捕获组,或者由于POSIX BRE中的:-)+|:-(+与文字:-)+|:-(+子字符串匹配而无法匹配(如果不能逃脱)。