我有一个场景,需要根据位置替换逗号分隔字符串中的值。以下是案例:
案例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在以上所有场景中都能正常工作?
2条答案
按热度按时间ajsxfq5m1#
我想这会满足你的要求:
其思想是捕获0到n个除逗号以外的连续字符,后跟逗号或字符串的结尾(后者被捕获)。然后将其替换为目标值,后跟捕获的零件。
mzsu5hc02#
如果你想坚持@gary\u w的模式,那么你可以(非常!)与@gmb的提议类似,但保留第二个捕获组:
使用一些示例数据:
@顺便说一句,gmb的方法对所有这些都得到了完全相同的结果。
如果您想保留空的第三个元素,那么可以使用
regexp_substr
有选择地应用替换的版本: