暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Regexp_replace或replace函数来替换匹配模式的每次出现

ASKTOM 2021-02-25
969

问题描述

嗨,汤姆,

提前谢谢。我正在尝试将裸十进制替换为 “0”。

这是示例。

字符串: '.45毫升-.91毫升-25微克/.5毫升-.9毫升 (.3毫升)-25.5毫升或.45毫升

每次出现的裸小数点都应替换为 “0”。导致

'0.45毫升-0.91毫升-25微克/0.5毫升-0.9毫升 (0.3毫升)-25.5毫升或0.45。请注意,字符串中的25.5不是裸十进制,并保持不变。

我试图使用替换功能来实现,但对解决方案并不完全有信心。

with str_rec as (
SELECT        
'.45ML-.91ML-25MCG/.5ML-.9ML(.3ML)-25.5ML or  .45' str
from dual
)
select  case when substr(str, 1, 1) = '.' then
                  regexp_replace(replace(
                        replace(
                               replace(
                                       replace(
                                               replace( str, ' .', ' 0.'),   
                                                 '/.', '/0.'), 
                                      '\.', '\0.'), 
                                '(.', '(0.'),
                        '-.', '-0.'), '[.]', '0.', 1, 1) 
        else 
             replace(
                     replace(
                             replace(
                                     replace(
                                             replace( str, ' .', ' 0.'),   
                                     '/.', '/0.'), 
                             '\.', '\0.'), 
                      '(.', '(0.'),
              '-.', '-0.')
        end,
      regexp_count(str, '[.]', 1, 'i')         
from str_rec;



我们可以使用regexp_replace实现此目的,还是有更好的方法来做到这一点。

谢谢

专家解答

你可以做这样的事情:

Match the start-of-line or any character that is not a number

起点是插入符号 “^”

要匹配列表中没有的任何字符,请使用带有插入符号的方括号作为第一个字符来开始 “反匹配”。然后是您要避免的字符列表。给予 [^ 0-9]

你想要这些中的任何一个,所以你需要选择操作员管道 “|” 或他们。也把这些放在括号里,这样你就可以保存这个字符替换:

(^|[^0-9])


Followed by a dot

你需要用反斜杠转义,因为它自己的句点匹配任何字符:
\.


所以要匹配的完整模式是:

(^|[^0-9])\.


Replace this with zero followed by the matched character and dot

您可以用 \ 1引用保存的字符; 该数字是您要调用的子表达式的正则表达式中的位置。

\10.


这给出了:

with str_rec as (
  select        
  '.45ML-.91ML-25MCG/.5ML-.9ML(.3ML)-25.5ML or  .45' str
  from dual
)
  select regexp_replace ( 
          str, '(^|[^0-9])\.', '\10.'
         ) 
  from   str_rec;
  
REGEXP_REPLACE(STR,'(^|[^0-9])\.','\10.')                
0.45ML-0.91ML-25MCG/0.5ML-0.9ML(0.3ML)-25.5ML or  0.45    


当然,这确实假设您出于其他原因在字符串中没有句点
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论