Ошибка в регулярном выражении с помощью вихревых скобок - PullRequest
1 голос
/ 30 марта 2019

Я пытаюсь удалить все экземпляры ": -) + |: - (+" в строке, но компилятор продолжает выдавать мне ошибку регулярного выражения

Я пытался использовать regex_constants ::basic, переключение регулярного выражения на «: -) + |: - (+» и переключение на c ++ 14 версию MinGW

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

, приведенный выше код даже начинает выделяться в IDE с «неизвестным escape»последовательность "\)" "

1 Ответ

2 голосов
/ 30 марта 2019

Чтобы удалить строки типа :-)))) и :-(((, используйте

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

См. Демонстрационную версию C ++

Существует две проблемы:

  • "\(" создает недопустимую escape-последовательность строки, отсюда и ошибка.Чтобы сформировать escape-последовательности регулярных выражений, обратная косая черта перед ( должна быть литеральной обратной косой чертой , а для определения литеральной обратной косой черты вы должны либо использовать "\\" или R"(\)".
  • Указавфлаг regex_constants::basic, требуется, чтобы механизм анализировал ваше выражение как регулярное выражение POSIX BRE, и это сделало ваш шаблон недействительным (если его экранировали), так как \( и \) используются для формирования групп захвата или не соответствуют(если не escape), поскольку :-)+|:-(+ в POSIX BRE соответствует литеральной :-)+|:-(+ подстроке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...