ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

正则匹配无处不在

2021-04-05 23:57:52  阅读:255  来源: 互联网

标签:匹配 title -- zA 无处不在 正则 sc meeting select


正则匹配无处不在


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

标签:匹配,title,--,zA,无处不在,正则,sc,meeting,select
来源: https://blog.csdn.net/hejianjun1989/article/details/115410411

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有