Есть строка, в которой встречаются такие вещи, как (..(число)..)
. Скобок может быть от одной до много, но скобки расставлены правильно - например,
(((((4)))((5))))
Как правильно убрать скобки? Я сделал примерно так -
regex rx("\\((\\d*)\\)");
а потом многократно - пока срока меняется - замену:
string out = s;
while( (out = regex_replace(s,rx,"$1")) != s) s = out;
Но что-то мне думается, что вложенные скобки можно убирать одним заходом, просто я не придумал как.
Подскажите, кто знает.
Именно такой подход, как в вашем вопросе, и используется, если библиотека регулярных выражений не поддержтвает рекурсию или сбаланисрованные конструкции. std::regex
их также не поддерживает.
Если хотите, можете воспользоваться библиотекой boost::regex
, которая поддерживает рекурсию:
#include <iostream>
#include <vector>
#include <boost/regex.hpp>
int main()
{
std::string s = "(((((4)))((5)))) ,,,,(((((4)))((5)))) 112 (((((4)))((5)))) (a(4)b((c))d(((5))))";
boost::regex expr{R"(\((?=\(*(\d+)\))(?>\d+|(?R))*\))"};
std::string fmt{R"(\1)"};
std::cout << boost::regex_replace(s, expr, fmt) << '\n';
return 0;
}
// => 4 ,,,,4 112 4 (a4b((c))d5)
См. пример работы кода на С++.
Регулярное выражение тут
\((?=\(*(\d+)\))(?>\d+|(?R))*\)
Подробности
\(
- символ (
(?=\(*(\d+)\))
- блок предварительного просмотра вперёд, который требует наличия (
, затем 1 и более цифр (захватываемых в подмаску №1), а затем )
сразу после текущей позиции(?>\d+|(?R))*
- 0 и более повторов 1+ цифр или же целого выражения (рекурсивно)\)
- символ )
Как отфильтровать по русскому алфавиту значения одной из нескольких переменной, которые выводятся через цикл foreach?
Помогите разобраться с запросом к API с JWT авторизациейВ идеале пример кода