本文面向的是对其它语言的正则表达式相关语法有详细了解的读者。所以,关于正则表达式的语法不会单独介绍,只是会在介绍相关函数使用方法时,对于涉及到的正则表达式会有相应的说明。
- regexp_like(srcstr,pattern,match_modifier)
- srcstr表示搜索的源字符串
- pattern表示匹配的目标字符串
- match_modifier匹配符,如i为不区分大小写
该函数由于检验字符串中是否含有给定模式的字符串,匹配成功则返回true,否则返回false
begin
dbms_output.put_line(case when regexp_like('zhangsan,lisi,wangwu','^(([a-z]*),)+([a-z]*)$','i') then 'contain' else 'not contain' end);
end;
上述SQL输出结果为contain
[a-z]表示为字符集a,b,c,…z中的任意一个字符
[a-z]*表示一个或多个字符集a,b,c,…z中的任意字符
^表示行开始,$表示行结束
i为修饰符,表示匹配模式时不区分大小写。
- regexp_instr(srcstr,pattern,beginpos,occurrence,returnoption,match_modifier,subexpression)
- srcstr表示搜索的源字符串
- pattern表示定位的目标字符串
- beginpos从哪个位置开始检索
- occurrence表示定位的字符串在源自符串中出现的次数,如第一次、第二次…
- returnoption:0表示返回定位字符串的起始的索引位置,1返回终止的索引位置
- match_modifier:匹配符
- subexpression:子表达式,从左往右括号括起来的表达式分别为子表达式1,2,3,4
select regexp_instr('zhangsln,lisi,wangwu','(^|,)(l[a-z]*)(,|$)',1,1,0,'i',2) from dual;
上述SQL用于检索逗号分隔的字符串中以l开头的字符串起始索引位置
(^|,)表示为行起始字符或者前面为分隔符,第一个子表达式
(l[a-z]*)表示以l开头的字符串,为第二个子表达式
(,|$)表示后面跟着,或者行结尾,为第三个子表达式
故上述SQL的结果为字符串lisi在整个字符串中的索引位置为9.
- regexp_substr(srcstr,pattern,beginpos,occurrence,match_modifier,subexpression)
- srcstr表示搜索的源字符串
- pattern表示目标字符串模式
- beginpos从哪个位置开始检索
- occurrence表示定位的字符串在源自符串中出现的次数,如第一次、第二次…
- match_modifier:匹配符
- subexpression:子表达式
select regexp_substr('zhangsln,lisi,wangwu','(^|,)(l[a-z]*)(,|$)',1,1,'i',2) from dual;
如上所述,我们容易知道执行上述SQL用于提取逗号分隔的字符串中以l开头的字符串,故SQL执行结果为lisi
- regexp_count(srcstr,pattern,beginpos,match_modifier)
- srcstr表示搜索的源字符串
- pattern表示目标字符串模式
- beginpos从哪个位置开始检索
- match_modifier:匹配符
select regexp_count('zhangsan,lisi,wangwu','[a-z]*,|[a-z]$',1,'i') from dual;
上述SQL用于统计逗号分隔字符串的个数。
- regexp_replace(srcstr,pattern,replacement,beginpos,occurrence,match_modifier)
- srcstr表示搜索的源字符串
- pattern表示被替换的字符串模式
- replacement表示用于替换的字符串
- beginpos从哪个位置开始检索
- occurrence表示被替换的字符串在源自符串中出现的次数,如第一次、第二次…
- match_modifier:匹配符
select regexp_replace('zhangsan,lisi,lisi','(^|,)(l[a-z]*)(,|$)','\1wangmazi\3',1,1,'i') from dual
上述SQL用于替换第一次出现的字符串lisi为wangmazi
\1wangmazi\3中\1表示第一个子表达式,\3表示第三个子表达式
上述sql的结果为zhangsan,wangmazi,lisi
- 关于贪婪型、勉强型正则表达式的问题参考我的另一篇博文浅谈Java正则表达式勉强型、贪婪型模式,虽然是以Java为例,但是结论是一样的