正则匹配无处不在

本文通过四个场景展示了PostgreSQL中正则表达式的应用,包括匹配金额字段、从描述性文本中提取数字、从复杂字符串中提取特定类型字符以及判断字符串是否存在和格式校验。通过这些实例,强调了掌握正则表达式对于数据库操作的重要性,并提供了正则表达式常用情况的参考资料。
摘要由CSDN通过智能技术生成


说明:本文所用环境为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–正则表达式常用例子汇总

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值