Есть строка, в которой встречаются такие вещи, как (..(число)..). Скобок может быть от одной до много, но скобки расставлены правильно - например,
(((((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+ цифр или же целого выражения (рекурсивно)\) - символ )Сборка персонального компьютера от Artline: умный выбор для современных пользователей