一、参数解释说明:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
string:需要进行正则处理的字符串
pattern:进行匹配的正则表达式
position:起始位置,从字符串的第几个字符开始正则表达式匹配(默认为1) 注意:字符串最初的位置是1而不是0
occurrence:获取第几个分割出来的组(分割后最初的字符串会按分割的顺序排列成组)
modifier:模式(‘i’不区分大小写进行检索;‘c’区分大小写进行检索。默认为’c’)针对的是正则表达式里字符大小写的匹配
二、案列分析
1、SELECT REGEXP_SUBSTR(‘11a22A33a’,’[^A]+’,1,1,‘i’) AS STR FROM DUAL;
结果:11
分析:正则表达式是以A为标识进行分割,而’i’标识不区分大小写,所以结果是11,而不是11a22
2、SELECT REGEXP_SUBSTR(‘11a22A33a’,’[^A]+’,1,1,‘c’) AS STR FROM DUAL;
结果:11a22
分析:正则表达式是以A为标识进行分割,而’c’标识区分大小写,所以结果是11a22,而不是11
三、关联REGEXP_SUBSTR函数的occurrence
SELECT REGEXP_SUBSTR(‘11a22A33a’,’[^A]+’,1,level,‘c’) AS STR FROM DUAL connect by level<=5;
分析:把要输出来的第几个子串,通过一个变量level转换成输出多少个子串。level<=5代表的是输出5个,没有的为null。这样显然会输出多余null值,这不是我们想要的。
优化(直接输出为列):
SELECT REGEXP_SUBSTR(‘11a22A33a’,’[^A]+’,1,level,‘c’) AS STR FROM DUAL
connect by level<= length(‘11a22A33a’)-length(REGEXP_REPLACE(‘11a22A33a’,‘A’,’’))+1;
或者(直接输出为列):
SELECT REGEXP_SUBSTR(‘11a22A33a’,’[^A]+’,1,level,‘c’) AS STR FROM DUAL
connect by level<= (regexp_count(‘11a22A33a’,’\A’)+1)
四、正则表达式总结
参考文章
https://blog.csdn.net/a720561252803/article/details/90487187