Regexp_Replace 在 Oracle 中多次出现具有相同替换次数的字符

Posted

技术标签:

【中文标题】Regexp_Replace 在 Oracle 中多次出现具有相同替换次数的字符【英文标题】:Regexp_Replace multi occurance of a character with same number of replacements in Oracle 【发布时间】:2013-04-23 21:36:46 【问题描述】:

我需要一个正则表达式来将字符串中的 0 替换为 O,如果它链接到一个单词,则只有 0。 例如:

R0OSEVELT => ROOSEVELT
100 RO00SEVELT => 100 ROOOSEVELT
0RANGE10 => ORANGE10
PALT00OO = PLATOOOO

【问题讨论】:

【参考方案1】:

既然你已经用 sql 标记了问题,这是我可以想出的代码。

REPLACE
   (search_string,
REGEXP_SUBSTR
   (search_string,
    '([[:alpha:]]+|^|[[:space:]])0+([[:alpha:]]+|$|[[:space:]])'
   ),
TRANSLATE
   (REGEXP_SUBSTR
       (search_string,
        '([[:alpha:]]+|^|[[:space:]])0+([[:alpha:]]+|$|[[:space:]])'
       ),
    '0',
    'O'
   )
   )

这是输出。它适用于您的输入案例。也许我错过了一些其他的可能性。

R0OSEVELT --> ROOSEVELT
100 RO00SEVELT --> 100 ROOOSEVELT
0RANGE10 --> ORANGE10
PALT00OO --> PALTOOOO
RO00SEVELT 100 --> ROOOSEVELT 100
RANGE10 --> RANGE10
RANGE0 --> RANGEO

【讨论】:

真棒诺埃尔..非常感谢..似乎解决了所有的选项..伟大的工作!再次感谢您的时间和帮助。 看起来只有第一次出现的 0 被替换了。【参考方案2】:

您没有指定单独的单个零会发生什么,但是:

sed -E 's/([[:alpha:]])?0([[:alpha:]])/\1O\2/g; s/([[:alpha:]])0([[:alpha:]])?/\10\2/g'

将完成您指定的工作。 如果第一个替换命令在两个字母字符之间或至少后跟一个字母字符,即单词开头,则第一个替换命令用字母“O”替换零。第二个对词尾也是如此。

【讨论】:

SQL语句中如何实现?没看懂

以上是关于Regexp_Replace 在 Oracle 中多次出现具有相同替换次数的字符的主要内容,如果未能解决你的问题,请参考以下文章

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]

Regexp_Replace 在 Oracle 中多次出现具有相同替换次数的字符

在 oracle sql 中使用 regexp_replace 标准化地址

如何通过 Oracle 中的 regexp_replace 从逗号分隔列表中删除重复项?

oracle 的 regexp_replace 替换 https 不起作用

如何通过 Oracle regexp_replace 从空格分隔列表中删除重复项? [复制]