Oracle regexp_replace

问题描述 投票:0回答:1

我目前陷入了

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之后,出现了两个额外的引号..

请帮忙:)

oracle regexp-replace
1个回答
0
投票
  1. 使用行生成器将字符串拆分为标记;
  2. 获取报价的运行计数;
  3. 如果标签不在引号内,则用引号将其括起来;和
  4. 聚合字符串。

像这样:

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;

输出:

价值
nvl(replace('$$TAG1$$$$TAG2$$$$TAG3$$' ...) ... '$$TAG4$$' = '12345678' ... INST R('product1, product2,',',$$TAG5$$,') ... GET_CODE('$$TAG6$$', 'something')

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.