常用内容的正则表达式

电子邮箱

描述:

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个阿拉伯数字 (村/街/巷/弄/屯/队/路/号/单元/栋)至少包含一个

全角符号】的验证

 

posted @ 2020-11-27 14:16  一年变大牛  阅读(364)  评论(0编辑  收藏  举报