常用内容的正则表达式
电子邮箱
描述:
1、要忽略掉大小写
2、有vip.qq.com 这样的vip的qq邮箱,有sina.com.cn这样的长结尾邮箱
2、以非下划线开头,数字字母下划线为内容,以@分隔,以域名为结尾。@以后的域名就会适用于域名规则了,即 字母数字减号.com net .cn .cc,也有.com.cn
5、网易邮箱的规则是:6到18个字符,可以使用字母、数字、下划线,需要以字母开头
6、新浪邮箱的规则是:4~16个字符,可以使用小写字母、数字、下划线、下划线不能在开头
[A-Za-z0-9\.\-_]{2,20}@[A-Za-z0-9\.\-]+
测试数据
g36314317@126.com hello2@125.com g44_cc@123.com zhango_cc@123.com 12345@qQ.com 123123@139.com q123123@china-ren.com asdfsdf@vip.sina.com.cn 12345@vip.qq.com 12345@vip.qq.com wangyanping1969@163.com 375669211@QQ.com 1245852@vip.QQ.com 1354654@aa.com wgy180@china-invs.cn abc@126.com _qda@aa.com ------------------- 以上正确 以下错误 ------------------- h哈1@ss.com 哈1@22a.com @1.com qao_cc@ 123.com
结果
身份证号
注释:不校验“非闰年,2月29日的问题”
参考:https://www.jb51.net/article/109384.htm
^([1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3})$
手机号码
说明:因为手机号码有各种号码段,以后也可能开通更多的号码段,所以只进行粗放限制,首位为1,纯数字,共11位
* 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
* 联通号码段:130、131、132、136、185、186、145
* 电信号码段:133、153、180、189,177
^1\d{10}$'
固定电话号码
区号为3到4位以0开头,电话1-9开头,共6到8位,如果有分机号,再加上分机号2~4位
^(0[0-9]{2,3}-)?[1-9][0-9]{5,7}(-[0-9]{3,4})?$
日期
考虑平年闰年 参考 https://www.cnblogs.com/mgod/archive/2007/04/26/728628.html
(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)
月份
如有需要,去掉减号
(18|19|20)[0-9]{2}-(0[1-9]|1[012])
姓名
关于中文字,网上流传着非常多的版本,各有各的问题,大多是基于汉字的编码,然后把编码中的一段作为评价标准,如果字段中有内容不来自于这个段,那么认定为不符合要求。
一般来说,在不同的编码系统中(GB2312,GBK,UTF8),使用Oracle提供的ASCIISTR()函数,都能将一个字的内容,唯一地转化成一个编码,编码由一个4位16进制数构成,
具体的对照关系可以查表(不考虑代理区问题)
Unicdoe【真正的完整码表】对照表(一) https://blog.csdn.net/hherima/article/details/9045765
Unicdoe【真正的完整码表】对照表(二)汉字Unicode表 https://guoxiaodong.blog.csdn.net/article/details/9045861
字符编码的奥秘utf-8, Unicode https://blog.csdn.net/hherima/article/details/8655200
Unicode全表 http://www.tamasoft.co.jp/en/general-info/unicode.html
另外还需要查看位数,不考虑少数民族名字的情况时,【全是汉字】【汉字不超过4位】即可满足要求
3400~4DB5 4E00~9FD5 F900~FAD9 当然,还是有极小的BUG的 ,但如果使用网上流行的 3400~9FD5会方便很多
select ASCIISTR('㾊') from dual;
Select UNISTR ('\9fFF') from dual;
regexp_LIKE(xingming,'^[' || unistr('\3400') || '-' || unistr('\9fa5') || ']{2,5}$')
select xingming from tab1 where not regexp_LIKE(xingming,'^[' || unistr('\3400') || '-' || unistr('\9fa5') || ']{2,5}$')
这里的问题不在于【正则表达式难写】,而在于别人【很粗糙地判断完第一个字符就不管了】。
甚至这里边有个oracle11g的一个错误【regexp_like有bug】
select 1 from dual where not regexp_LIKE('李堃','^[' || unistr('\3400') || '-' || unistr('\9fa5') || ']{2,5}$');
select 1 from dual where not regexp_LIKE('李三','^[' || unistr('\3400') || '-' || unistr('\9fa5') || ']{2,5}$');
的结果不同,然而
后来将简洁的写法变成了冗长不优美的写法,能解决这个问题。。。。
select * from table1 where ASCIISTR(nvl(substr(accname,1,1),'3'))not BETWEEN '\4E00' AND '\9FA5' or ASCIISTR(nvl(substr(accname,2,1),'3'))not BETWEEN '\4E00' AND '\9FA5' or ASCIISTR(nvl(substr(accname,3,1),'张')) not BETWEEN '\4E00' AND '\9FA5' or ASCIISTR(nvl(substr(accname,4,1),'张')) not BETWEEN '\4E00' AND '\9FA5' or ASCIISTR(substr(accname,5,1)) is not null
另外还有【地址】
不包含连着的两个英文字母,不包含连着5个阿拉伯数字 (村/街/巷/弄/屯/队/路/号/单元/栋)至少包含一个
【全角符号】的验证
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人