1:これを使って逆パターン
regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace(
pattern, '(\()', '\1#') , '(\))', '#\1') , '\(#', ')#') , '\^\)#', '^') , '#\)\$', '$') , '#\)', '(#') , '#', '') , '\^([^\(]+\))', '^(\1') , '\(([^\)]+)\$', '(\1)$');
つまり、"^(. )..(.).$"; "^. (..).(.)$" になります。
2: これを使用して、両方のパターン内のキャプチャ グループのインデックスとカウントを一括収集します。
SELECT REGEXP_instr(pattern, '\(.*?\)+', 1, LEVEL) bulk collect into posCapture FROM v CONNECT BY LEVEL <= REGEXP_COUNT(pattern, '\(.*?\)');
3: マスクするテキストに対して両方のパターンを一致させます。手順 2 で見つけた順序でそれらをマージします。
select regexp_replace(v_src, pattern, '\' || captureIndex) into tempStr from dual;