【发布时间】:2020-09-30 03:41:18
【问题描述】:
我有一个场景,我必须根据位置替换逗号分隔字符串中的值。 以下是案例:
案例一:
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 has written about the problem 使用该正则表达式模式来拆分字符串,正是因为它如何处理空标签
所以我尝试了案例 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_replace 在上述所有场景中都有效吗?
【问题讨论】:
-
怎么样:不要将数字列表存储为分隔字符串? SQL 有一种存储列表的好方法;它被称为表格,而不是字符串。
-
您的案例 4 没有按预期工作,因为模式匹配“消耗”了逗号,但没有与替换字符串一起放回。本着您提到的我的帖子的精神,亚历克斯的帖子将尾随字符(捕获的第 2 组)放回去。
标签: sql regex oracle regexp-replace