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

Oracle 替换字符的正则表达式

askTom 2016-10-19
176

问题描述

我们是否可以使用正则表达式只替换位置3到8的字符串。例如: 1234567890应给出12######90

专家解答

当然可以。

(..)(.{1,6})(.*)


匹配任意两个字符。后跟任意1-6个字符。然后是任意数量的尾随字符。

可以将此传递给regexp_replace ,并使用反向引用来保留第一个和第三个匹配项的值。

不过, Oracle不支持条件引用。因此,如果字符串长度在3到8个字符之间,我不确定只显示#s的方式,直到字符串的长度:

with rws as (
  select 1234567890 x from dual union all
  select 1 x from dual union all
  select 12345 x from dual 
)
  select regexp_replace(x, '(..)(.{1,6})(.*)', '\1######\3') from rws;

REGEXP_REPLACE(X,'(..)(.{1,6})(.*)','\1######\3')  
12######90                                         
1                                                  
12######


虽然您不需要使用正则表达式!标准substr也执行此工作:

with rws as (
  select 1234567890 x from dual union all
  select 1 x from dual union all
  select 12345 x from dual 
)
  select substr(x, 1, 2) || rpad('#', length(substr(x, 3, 8)), '#') || substr(x, 9)
  from   rws;

SUBSTR(X,1,2)||RPAD('#',LENGTH(SUBSTR(X,3,8)),'#')||SUBSTR(X,9)  
12########90                                                     
1                                                                
12###

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论