oracle-regexp\u在逗号分隔的字符串中替换为null

jxct1oxe  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(433)

我有一个场景,需要根据位置替换逗号分隔字符串中的值。以下是案例:
案例1:

select regexp_replace('1,2,3','[^,]+',5,1,3)
from dual;

返回正确的结果:1,2,5
案例2:

select regexp_replace('1,,3','[^,]+',5,1,3)
from dual;

返回结果:1,,3
预期结果:1,,5
@gary_w写过使用regex模式分割字符串的问题,正是因为它如何处理空标记
所以我尝试了案例3:

select regexp_replace('1,,3','(.*?)(,|$)',5,1,3)
from dual;

返回预期结果:1,,5
但如果我尝试这个案例4:

select regexp_replace('1,2,3','(.*?)(,|$)',5,1,2)
    from dual;

返回结果:1,53
预期结果:1,5,3
我知道正则表达式有问题,有没有办法让regexp\u replace在以上所有场景中都能正常工作?

ajsxfq5m

ajsxfq5m1#

我想这会满足你的要求:

regexp_replace(col, '[^,]*(,|$)','5\1', 1, 3)

其思想是捕获0到n个除逗号以外的连续字符,后跟逗号或字符串的结尾(后者被捕获)。然后将其替换为目标值,后跟捕获的零件。

mzsu5hc0

mzsu5hc02#

如果你想坚持@gary\u w的模式,那么你可以(非常!)与@gmb的提议类似,但保留第二个捕获组:

regexp_replace(str, '(.*?)(,|$)', '5\2', 1, 3)

使用一些示例数据:

with t (str) as (
            select '1,2,3' from dual
  union all select '1,,3' from dual
  union all select '1,2,3,4' from dual
  union all select '1,,3,4' from dual
  union all select '1,,,4,' from dual
  union all select ',,3' from dual
  union all select ',,3,' from dual
  union all select ',,,' from dual
  union all select '1' from dual
)
select str,
  regexp_replace(str, '(.*?)(,|$)', '5\2', 1, 3) as result
from t;

STR     RESULT    
------- ----------
1,2,3   1,2,5     
1,,3    1,,5      
1,2,3,4 1,2,5,4   
1,,3,4  1,,5,4    
1,,,4,  1,,5,4,   
,,3     ,,5       
,,3,    ,,5,      
,,,     ,,5,      
1       1

@顺便说一句,gmb的方法对所有这些都得到了完全相同的结果。
如果您想保留空的第三个元素,那么可以使用 regexp_substr 有选择地应用替换的版本:

with t as (...)
select str,
  case when regexp_substr(str, '(.*?)(,|$)', 1, 3, null, 1) is not null
    then regexp_replace(str, '(.*?)(,|$)', '5\2', 1, 3)
    else str
  end as result
from t;

STR     RESULT    
------- ----------
1,2,3   1,2,5     
1,,3    1,,5      
1,2,3,4 1,2,5,4   
1,,3,4  1,,5,4    
1,,,4,  1,,,4,    
,,3     ,,5       
,,3,    ,,5,      
,,,     ,,,       
1       1

相关问题