说明:本文所用环境为postgresql
参考:https://blog.csdn.net/learning_oracle_lh/article/details/46639199
场景一
前两天,同事问到怎么匹配金额字段(数值),印象中好像是写过类似的,翻到之前写的一篇博客,链接在段末给出。不过写的稍微有点问题,博客中的匹配会认为 ‘.13’,’.5’… 这种以小数点开头的数值也是能匹配上的,这个要根据具体的要求来定。如果要求小数点前面必须要有数字,稍作改动,将*(重复出现0次或1-n次)改为+(重复出现1-n次);同理,小数点后面的如果有要求也可以做相同的调整。
链接:https://blog.csdn.net/hejianjun1989/article/details/112255800
场景二
在做一个需求开发的时候,业务方想要一个描述性的语句中只取其中表示业务含义的数字。数据和代码如下:
with temp_data as
(
select '20130105' as meeting_date, '第十八届五中全会第3次会议' as meeting_title
union all
select '20150612' as meeting_date, '第十八届七中全会第15次会议' as meeting_title
union all
select '20200306' as meeting_date, '第十九届一中全会首次会议' as meeting_title
)
select meeting_date,
meeting_title,
case when meeting_title like '%首次%' then '1'
else regexp_replace(substring(meeting_title,position('次' in meeting_title) -3 , 3),'[^0-9]','','g') end as meeting_number
-- 根据描述特征,截取'次'前面的三个字符,然后正则匹配出数字
from temp_data
查询结果
场景三
到这里,就自然的想到之前帮别人写的 一个取一个包含汉字字母数字和特殊符号的字符串里面的特定类型,
比如取 数字 的:
select regexp_replace('asb #华为234n技术t34','[^0-9]','','g');
-- 将非数字的都替换为空字符
比如取 汉字 的:
select regexp_replace('asb #华为234n技术t34','[^\u4e00-\u9fa5]','','g');
-- 将非汉字的都替换为空字符,匹配中文字符的正则表达式: [\u4e00-\u9fa5]
比如取 字母 的:
select regexp_replace('asb #华为234n技术t34','[^a-zA-Z]','','g');
-- 将非字母的都替换为空字符
小结:如果字段包含的字符串类型太多,比如既有字母,数字,有些标点符合和特殊字符,这种最好是用取反的方式处理 ‘[^XXX]’ ;如果包含的类型比较少也可以正向处理:
eg:
with temp_test as
(
select '贺老师在派诺创始占5%的股份' as desc1
union all
select '陈老师在Bitcorn占10%的股份' as desc1
)
-- select regexp_replace(desc1,'[^0-9%]','','g') from temp_test;
select regexp_replace(desc1,'[a-zA-Z\u4E00-\u9FA5]','','g') from temp_test;
场景四
在写一个存储过程时候需要判断入参是否已经存在以及入参的格式是否符合要求(字母开头字母结尾只能包含字母和下划线)
是否已经存在:
select 'public,sc_dm_ioc,hjj_test' ~ 'sc_dm_ioc','public,sc_dwm_ioc,hjj_test' ~ 'sc_dm_ioc';
-- 第一个结果为t,后一个结果为f;也可以使用position函数判断位置,为0时说明不包含,为其他值则说明包含
是否符合要求:
select 'sc_dm_ioc' ~ '^[a-zA-Z][a-zA-Z_]*[a-zA-Z]$','sc_dm1_ioc' ~ '^[a-zA-Z][a-zA-Z_]*[a-zA-Z]$','sc_dm_ioc_' ~ '^[a-zA-Z][a-zA-Z_]*[a-zA-Z]$';
-- 第一个结果为t,后两个结果为f
总结
正则匹配本身就是一个很大的学科,在数据库中的应用也是比较广泛的。熟悉正则的匹配规则,使用时便可信手拈来。分享一个自己收藏的正则的常用情形:Oracle–正则表达式常用例子汇总