regex - как правильно убрать вложенные скобки?

278
13 июня 2022, 04:10

Есть строка, в которой встречаются такие вещи, как (..(число)..). Скобок может быть от одной до много, но скобки расставлены правильно - например,

(((((4)))((5))))

Как правильно убрать скобки? Я сделал примерно так -

regex rx("\\((\\d*)\\)");

а потом многократно - пока срока меняется - замену:

string out = s;
while( (out = regex_replace(s,rx,"$1")) != s) s = out;

Но что-то мне думается, что вложенные скобки можно убирать одним заходом, просто я не придумал как.

Подскажите, кто знает.

Answer 1

Именно такой подход, как в вашем вопросе, и используется, если библиотека регулярных выражений не поддержтвает рекурсию или сбаланисрованные конструкции. 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+ цифр или же целого выражения (рекурсивно)
  • \) - символ )
READ ALSO
Как скомилировать такой шаблон

Как скомилировать такой шаблон

Не пойму как правильно написать invoke чтоб компилировалось

247
Как отфильтровать значение переменной в цикле?

Как отфильтровать значение переменной в цикле?

Как отфильтровать по русскому алфавиту значения одной из нескольких переменной, которые выводятся через цикл foreach?

281
Необходимо сформировать GET или POST запрос к API с JWT авторизацией

Необходимо сформировать GET или POST запрос к API с JWT авторизацией

Помогите разобраться с запросом к API с JWT авторизациейВ идеале пример кода

231