SQL regexp - 替换两个数字之间的点

SQL regexp - replace dots between two numbers

我需要改变这个;

J S49-1:7.5-190 d.

到此;

J S49-1:7,5-190 d.

将所有点替换为逗号,但仅限于数字之间。

使用REGEXP_SUBSTR的一种方式:

select REGEXP_SUBSTR('J S49-1:7.5-190 d','[^.]+',1,1)||','||REGEXP_SUBSTR('J S49-1:7.5-190 d','[^.]+',1,2) from dual;

这里是 regexp_replce

select REGEXP_REPLACE('J S49-1:7.5-190 d','[.*]',',') from dual

REGEXP_REPLACE 内使用捕获组;

select REGEXP_REPLACE('J S49-1:7.5-190 d.', '(.*\d)\.(\d.*)', ',') from dual;

will return;

J S49-1:7,5-190 d.

但是如果数字之间出现多次句点,这将不起作用。

如果数字之间出现不止一次句点

我能够用捕获组触发多重替换;

select REGEXP_REPLACE('J S49-1:7.557.8-190 d.', '(\d)\.(\d)', ',', 1, 0) from dual;

will return;

J S49-1:7,557,8-190 d.

最后两个参数是; start_positionnth_appearance,要替换所有出现的地方,nth_appearance 值必须是 0

但是当两个capture groups共享一个数字的时候还是有问题,这是因为overlapping(same issue as this),需要lookahead才能解决,但是在oracle中不能使用,hmmm。

如果数字之间出现不止一次句点,并且两次出现之间共享相同的数字

一个解决方案是应用辅助 REGEXP_REPLACE 我已经分享了两次,所以任何重叠的情况都将在第二个 运行;

中涵盖
select REGEXP_REPLACE(
                 REGEXP_REPLACE('J S49-1:7.5.8.7-190 d.', '(\d)\.(\d)', ',', 1, 0), 
                 '(\d)\.(\d)', ',', 1, 0) from dual;

will be the correct result;

J S49-1:7,5,8,7-190 d.

有关 REGEXP_REPLACE 的更多详细信息,请查看 here