我目前陷入了
regexp_replace
制定更新数千行的工作模式......
字符串看起来像这样:
nvl(replace('$$TAG1$$$$TAG2$$$$TAG3$$' …) … $$TAG4$$ = '12345678' … INSTR('product1, product2,',',$$TAG5$$,') … GET_CODE($$TAG6$$, 'something')
我稍微修改了字符串,但关键部分保持不变。
我只需要替换(添加引号括起来)那些尚未在引号中的
$$TAG$$
。这些将是 &&TAG6&&
和 $$TAG4$$
当前模式:
SELECT REGEXP_REPLACE(
q'{nvl(replace('$$TAG1$$$$TAG2$$$$TAG3$$' …) … $$TAG4$$ = '12345678' … INSTR('product1, product2,',',$$TAG5$$,') … GET_CODE($$TAG6$$, 'something')}',
q'{(\'\${2}.*\${4}.*\${2}\')|(',\${2}[A-Za-z0-9_/i]+\${2},')|(\${2}[A-Za-z0-9_]+?\${2})}',
q'{\1\2'\3'}'
) AS result
FROM dual;
结果:
nvl(replace('$$TAG1$$$$TAG2$$$$TAG3$$''' …) … '$$TAG4$$' = '12345678' … INSTR('product1, product2,',',$$TAG5$$,''') … GET_CODE('$$TAG6$$', 'something')
如您所见,在TAG3和TAG5之后,出现了两个额外的引号..
请帮忙:)
像这样:
SELECT s.*
FROM table_name t
CROSS JOIN LATERAL (
SELECT LISTAGG(
CASE
WHEN term LIKE '$$%$$'
AND MOD(num_quotes,2) = 0
THEN '''' || term || ''''
ELSE term
END,
NULL
) WITHIN GROUP (ORDER BY pos) AS value
FROM (
SELECT REGEXP_SUBSTR(t.value, q'!'|\$\$.*?\$\$|(\$?[^'$]+)+!', 1, LEVEL) AS term,
COUNT(
CASE
WHEN REGEXP_SUBSTR(t.value, q'!'|\$\$.*?\$\$|(\$?[^'$]+)+!', 1, LEVEL) = ''''
THEN 1
END
) OVER (ORDER BY LEVEL) AS num_quotes,
LEVEL AS pos
FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT(t.value, q'!'|\$\$.*?\$\$|(\$?[^'$]+)+!')
)
) s;
对于样本数据:
CREATE TABLE table_name (value) AS
SELECT q'{nvl(replace('$$TAG1$$$$TAG2$$$$TAG3$$' ...) ... $$TAG4$$ = '12345678' ... INSTR('product1, product2,',',$$TAG5$$,') ... GET_CODE($$TAG6$$, 'something')}' FROM DUAL;
输出:
价值 |
---|
|