命令格式:regexp_replace(source, pattern, replace_string, occurrence)
将source字符串中匹配pattern的子串替换成指定字符串后返回,当输入source, pattern, occurrence参数为NULL时返回NULL,若replace_string为NULL且pattern有匹配,返回NULL,replace_string为NULL但pattern不匹配,则返回原串。
1、用#
替换字符串中的所有数字
SELECT regexp_replace('01234abcde56789','[0-9]','#');
结果:#####abcde#####
用#
替换字符串中的数字0、9
SELECT regexp_replace('01234abcde56789','[09]','#');
结果:#1234abcde5678#
2、遇到非小写字母或者数字跳过,从匹配到的第4个值开始替换,替换为''
SELECT regexp_replace('abcdefg123456ABC','[a-z0-9]','',4)
结果:abcefg123456ABC
SELECT regexp_replace('abcDEfg123456ABC','[a-z0-9]','',4)
结果:abcDEg123456ABC
SELECT regexp_replace('abcDEfg123456ABC','[a-z0-9]','',7);
结果:abcDEfg13456ABC
遇到非小写字母或者非数字跳过,将所有匹配到的值替换为''
SELECT regexp_replace('abcDefg123456ABC','[a-z0-9]','',0);
结果:DABC
3、格式化手机号,将+86 13811112222
转换为(+86) 138-1111-2222
,+
在正则表达式中有定义,需要转义。\\1
表示引用的第一个组
SELECT regexp_replace('+86 13811112222','(\\+[0-9]{2})( )([0-9]{3})([0-9]{4})([0-9]{4})','(\\1)\\3-\\4-\\5',0);
结果:(+86)138-1111-2222
SELECT regexp_replace("123.456.7890","([[:digit:]]{3})\\.([[:digit:]]{3})\\.([[:digit:]]{4})","(\\1)\\2-\\3",0) ;
SELECT regexp_replace("123.456.7890","([0-9]{3})\\.([0-9]{3})\\.([0-9]{4})","(\\1)\\2-\\3",0) ;
结果:(123)456-7890
4、将字符用空格分隔开,0表示替换掉所有的匹配子串。
SELECT regexp_replace('abcdefg123456ABC','(.)','\\1 ',0) AS new_str FROM dual;
结果:a b c d e f g 1 2 3 4 5 6 A B C
SELECT regexp_replace('abcdefg123456ABC','(.)','\\1 ',2) AS new_str FROM dual;
结果:ab cdefg123456ABC
5、
SELECT regexp_replace("abcd","(.*)(.)$","\\1",0) ;
结果:abc
SELECT regexp_replace("abcd","(.*)(.)$","\\2",0) ;
结果:d
SELECT regexp_replace("abcd","(.*)(.)$","\\1-\\2",0) ;
结果:abc-d
SELECT regexp_replace("abcd","(.)","\\2",1) 结果为`"abcd"`,因为pattern中只定义了一个组,引用的第二个组不存在。
SELECT regexp_replace("abcd","(.*)(.)$","\\2",0) 结果为"d"
SELECT regexp_replace("abcd","(.*)(.)$","\\1",0) 结果为"abc"
SELECT regexp_replace("abcd","(.*)(.)$","\\1-\\2",0) 结果为"abc-d"
SELECT regexp_replace("abcd","a","\\1",0),结果为” \1bcd”,因为在pattern中没有组的定义,所以\1直接输出为字符。
在SQL中尝试使用正则,可以试下regexp_substr()来进行分割
1.首先创建一个实验视图:
SQL>
create or replace view test_ip as select '192.168.1.1' as ip from dual
union all
select '192.168.1.2' as ip from dual
union all
select '192.168.1.3' as ip from dual
union all
select '192.168.1.4' as ip from dual;
2.查看下视图的整体结构
SQL> select * from test_ip;
IP
-----------
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
3.实例
(1)现在有一个需求,需要将这些ip以“.”为分隔符,分段显示ip
最终效果如下:
IP1 IP2 IP3 IP4
---------------------- ---------------------- ---------------------- -----
192 168 1 1
192 168 1 2
192 168 1 3
192 168 1 4
执行的SQL如下:
select regexp_substr(a.ip, '[^.]+', 1, 1) ip1,
regexp_substr(a.ip, '[^.]+', 1, 2) ip2,
regexp_substr(a.ip, '[^.]+', 1, 3) ip3,
regexp_substr(a.ip, '[^.]+', 1, 4) ip4 from test_ip a;
分析:
regexp_substr()括号中的
[^.] -->代表除了“.”以外的全部字段
+ -->表示匹配1次以上
1 -->表示从第一个“.”开始
2 -->表示匹配到的第二个字段
这样就能达到这个效果
参考:https://blog.csdn.net/JohnnyChu/article/details/111184962
https://blog.csdn.net/boos_zhao/article/details/121470300