WITH T AS ( SELECT '(12345(678))' TXT FROM DUAL UNION ALL SELECT 'abcde(12345)(6(7)8)' FROM DUAl UNION ALL SELECT 'wrrt(12678(123)1234567)' FROM DUAL UNION ALL SELECT 'wrrt(12678(123)123(4)567)' FROM DUAL UNION ALL SELECT '((1234)5678012345)' FROM DUAL UNION SELECT '(abc(abc(abc(abc)(a(b)c))abc)abc)' FROM DUAL UNION ALL SELECT '(abc(abc)abc(abc)abc(abc)abc)' FROM DUAL UNION ALL SELECT '(abc(abc(abc)abc)abc(abc)abc(abc)abc)' FROM DUAL UNION ALL select '0(12(34))(56(7(8)01(23))45)' FROM DUAL ) , T2(ORGTXT, BEFTXT, TXT) AS ( SELECT TXT, '*', TXT FROM T UNION ALL SELECT T2.ORGTXT, T2.TXT, REGEXP_REPLACE(TXT,'(\(|\))([^()]*)\(([^()]+)\)([^()]*)(\(|\))','\1\2\3\4\5') TXT FROM T2 WHERE T2.BEFTXT != T2.TXT ) SELECT ORGTXT, TXT FROM T2 WHERE BEFTXT = T2.TXT
WITH t AS ( SELECT 1 pk, '0(12(34))(56(7(8)01(23))45)' v FROM dual --> 0(1234)(5678012345) ) SELECT pk, v , LISTAGG(z) WITHIN GROUP(ORDER BY lv) x FROM (SELECT pk, v , lv , x, y , CASE WHEN x = '(' AND y != 1 THEN '' WHEN x = ')' AND y != 0 THEN '' ELSE x END z FROM (SELECT pk, v , lv , SUBSTR(v, lv, 1) x , SUM(DECODE(SUBSTR(v, lv, 1), '(', 1, ')', -1, 0)) OVER(PARTITION BY pk ORDER BY lv) y FROM t , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99) WHERE lv <= LENGTH(v) ) ) GROUP BY pk, v ;