1、参数说明
REGEXP_SUBSTR(str,pattern,position,occurrence,modifier)
- str : 需要进行正则处理的字符
- pattern : 正则表达式
- position : 翻译表示位置 ,这里表示起始位置,表示从字符串的第几个字符开始匹配,一般都是起始位置1 开始
- occurrence : 获取第几个分割出来的组。(分割后的字符串类似于一个数组,需要获取第几个数组传入)用来获取分割后的返回
- modifier : 翻译表示修饰符 这里表示模式
- i : 为i 时表示不区分大小写分割
- c : 为c 时表示区分大小写分割 默认为 c 的模式
2、测试使用
select REGEXP_SUBSTR('1,,&,5,2,3', '[^,]', 1,2) from dual;
返回信息
&
表示 : 正则表达式由, 开始截取 从字符串第一位开始,获取截取后的数组第二个值
该函数的使用主要集中于如何写正则表达式
2、动态的增长 occurrence 值
如何获取截取出来的所有数值?通过使用 CONNECT BY LEVEL 两个配合在一起使用。获取所有的数组值。
LEVEL : 伪列,用来记录,可以当作一个用来自增的 虚拟列
select level from dual CONNECT by level <= 5
那么如果想要展示截取出来所有结果就需要和他配合使用。
SELECT REGEXP_SUBSTR('11a22A33a','[^A]+',1,level,'i') AS STR
FROM DUAL
connect by level<=5;
结果是截取出来展示 11,22,33 但是因为level小于等于5所以展示了5行有两行数据是空的。
动态的获取level值
第一种是获取需要截取出来的数组有多少,使用函数regexp_count
SELECT REGEXP_SUBSTR('11a22A33a','[^A]+',1,level,'i') AS STR FROM DUAL connect by level<=regexp_count('11a22A33a','[^A]+');
第二种是按照截取的信息再次截取并且增加判断
SELECT REGEXP_SUBSTR('11a22A33a','[^A]+',1,level,'i') AS STR FROM DUAL connect by REGEXP_SUBSTR('11a22A33a','[^A]+',1,level,'i') is not null
第三种是按照该截取的长度判断,使用regexp_replace将要截取的字符替换为空,然后使用旧字符长度减去新字符长度获取需要截取多少次
SELECT REGEXP_SUBSTR('11a22A33a','[^A]+',1,level,'i') AS STR FROM DUAL connect by level<= (length('11a22A33a') - length(REGEXP_REPLACE(upper('11a22A33a'),'A','')));