SQL正则表达式-替换两个数字之间的点

时间:2018-11-14 13:43:18

标签: oracle regexp-replace

我需要更改它;

J S49-1:7.5-190 d.

对此;

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

通过用逗号替换所有点,但只能在数字之间。

2 个答案:

答案 0 :(得分:4)

REGEXP_REPLACE内具有捕获组;

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

将返回;

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

但是,如果数字之间出现多个句点,则此操作将无效。

如果数字之间出现一个以上的句点

我能够触发捕获组的多次替换;

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

将返回;

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

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

但是当两个捕获组共享一个数字时仍然存在问题,这是由于重叠(same issue as this)引起的,需要提前解决,但不能在oracle hmmm中使用。

如果数字之间出现一个以上的句点,并且两次出现之间共享同一数字

一种解决方案是应用我共享过两次的辅助REGEXP_REPLACE,因此第二次运行将覆盖所有重叠的情况;

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

将是正确的结果;

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

有关REGEXP_REPLACE的更多信息,请选中here

答案 1 :(得分:2)

使用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