Вместо регулярного выражения, возможно, рассмотрим автомат с нажатием. (Я не уверен, что регулярные выражения Ruby могут справиться с этим, я верю, что Perl может).
(очень упрощенный) процесс может быть:
Для каждого символа во входной строке:
- Если это не '(' или ')', просто добавьте его к выводу
- Если это '(', увеличьте счетчик seen_parens и добавьте его
- Если это ')' и seen_parens равно> 0, добавьте его и уменьшите seen_parens. В противном случае пропустите это.
В конце процесса, если seen_parens равен> 0, удалите столько паренов, начиная с конца. (Этот шаг можно объединить с описанным выше процессом с использованием стека или рекурсии.)
Весь процесс O(n)
, даже если относительно высокие издержки
Удачного кодирования.