关于 Oracle Regexp_Replace

Posted

技术标签:

【中文标题】关于 Oracle Regexp_Replace【英文标题】:Regarding Oracle Regexp_Replace 【发布时间】:2018-10-07 04:16:54 【问题描述】:

我有一个字符串,如“Vinoth^Vinoth Karthick Vinoth^Vinoth^Vinoth”,由“^”分隔。我只想用 XXX 替换 Vinoth。

I/P String : Vinoth^Vinoth Karthick Vinoth^Vinoth^Vinoth
Expected output : XXX^Vinoth Karthick Vinoth^XXX^XXX

请建议如何使用 Regexp_replace 或 ORACLE SQL 语句中的任何其他函数来执行此操作。

【问题讨论】:

您应该能够将包含分隔符的字符串替换为新的字符串,也可以将包含分隔符的分隔符替换为 REPLACE。如果您的模式更复杂,您可能还需要使用 REGEX 替换选项。 你想把^VinothVinoth哪一个改成模式字符串?因为,我认为预期输出应该是 XXX^Vinoth Karthick XXX^Vinoth^VinothVinothXXX Karthick VinothXXXXXX ... I/P 字符串:Vinoth^Vinoth Karthick Vinoth^Vinoth^Vinoth 预期输出:XXX^Vinoth Karthick Vinoth^XXX^XXX 【参考方案1】:

将分隔符 ^ 加倍并将字符串包装在分隔符 ^ 字符中,以便每个元素都有自己独特的前导和尾随定界符,然后您只需将 ^Vinoth^ 替换为 ^XXX^ 并反转加倍分隔符并修剪前导和尾随分隔符:

SQL Fiddle

Oracle 11g R2 架构设置

SELECT 1 FROM DUAL;

查询 1

SELECT TRIM(
         '^' FROM
         REPLACE(
           REPLACE(
             '^' ||
             REPLACE(
               'Vinoth^Vinoth Karthick Vinoth^Vinoth^Vinoth',
               '^',
               '^^'
             )
             || '^',
             '^Vinoth^',
             '^XXX^'
           ),
           '^^',
           '^'
         )
       ) AS replaced
FROM   DUAL

Results

|                           REPLACED |
|------------------------------------|
| XXX^Vinoth Karthick Vinoth^XXX^XXX |

【讨论】:

【参考方案2】:

另一种选择:

SQL> with test (col) as
  2    (select 'Vinoth^Vinoth Karthick Vinoth^Vinoth^Vinoth' from dual),
  3  inter as
  4    (select regexp_substr(replace(col, '^', ':'), '[^:]+', 1, level) col,
  5            level lvl
  6     from test
  7     connect by level <= regexp_count(col, '\^') + 1
  8    )
  9  select listagg(regexp_replace(col, '^Vinoth$', 'XXX'), '^')
 10    within group (order by lvl) result
 11  from inter;

RESULT
-----------------------------------------------------------------------------

XXX^Vinoth Karthick Vinoth^XXX^XXX

SQL>

【讨论】:

这在 Vinoth^Vinoth Karthick :Vinoth^Vinoth^Vinoth 上失败 可能还有很多其他例子,@MT0,但这不是 OP 所说的输入。 OP 想要替换 ^ 分隔字符串的整个元素 - 您正在更改分隔符(当您不需要时),它现在将其视为分隔符所在的分隔列表^:,这是不正确的。更改正则表达式以搜索非插入字符,您不会遇到问题,但只是将问题排除在外,因为它与 OP 给出的狭窄示例不匹配,而不是问题的意图是虚伪的,不帮助有类似问题的未来用户。

以上是关于关于 Oracle Regexp_Replace的主要内容,如果未能解决你的问题,请参考以下文章

关于oracle 控制文件

关于退货声明的 Oracle 文档

oracle 中 关于角色的问题

关于 Oracle 12c 中的用户

关于Oracle函数ROWTOHEX()的问题

oracle 关于条件判断