本文首发自公众号【一个老码农】
文中的\d、\W等双反斜杠转义的适用于oc、swift、java等语言。而js、php、go等语言需要用单反斜杠,即\d、\W。而\d或\d与0-9等价,均代表数字可相互替换。关于正则基础语法,可自行查询。下面我来介绍下工作中常用的正则表达式。
-
手机号
^1(3|5|7|8)[0-9]{9}$
解释:
手机号以13、15、17、18开头,后面则是9位0-9的数字。其中[0-9]也可以改为[\d]。{9}代表后9位
-
邮箱
^[a-zA-Z_-\\d]+@[a-zA-Z_-\\d]+(\\.[a-zA-Z\\d_-]+)+$
解释:
邮箱一般格式为
有些邮箱只允许英文和字母,而有些邮箱允许包含下划线"_"和杠"-"
^[a-zA-Z_-\d]+ 以代表以字母、"_"、"-"、数字开头,后面的"+"代表一个字条符及以上
@[a-zA-Z_-\d]+ 代表@后面的字符以字母、"_"、"-"、数字组成,后面的"+"代表一个字条符及以上
(\.[a-zA-Z0-9_-]+) 代表"."后面的字符以字母、数字、"_"、"-"组成,最后的"+"代表一个字符以上
最后面的"+"号代表 括号里面的.xxx,可能有多个,如.com.cn
邮箱后缀一般由两位或三位字符组成,如: .com,.net,.cn,.me等,所以邮箱正则也可以改成这样:
^[a-zA-Z_-\d]+@[a-zA-Z_-\d]+(\.[a-zA-Z\d_-]{2,3})+$
- 网址
网址一般以http://或https://开头,所以正则可以这样写:
^(http(s)?:\\/\\/)
解释:(s)? 代表 “s”长度为0~1,也就是说s可有可无。
后面两个\/\/,代表"//",因为“/”需要转义,在oc、swift、java等语言中需要两个反斜杠,js、php等语言只需要一个反斜杠。
更加严谨的网址正则,如域名的匹配、query参数匹配,在此就不做介绍了。
- 密码强度
1.密码为8-32位,且必须包含大写字母、小写字母、数字、特殊符号(包含下划线)
^(?![A-Za-z0-9]+$)(?![a-z0-9\\W_]+$)(?![A-Za-z\\W_]+$)(?![A-Z0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,32}$
解释:^(?![A-Za-z0-9]+)(?![A-Za-z\W_]+) 代表排除只包含一种字符的情况、只包含两种字符的情况、只包含三种字符的情况
其中(?![A-Za-z0-9]+$) 排除大写字母、小写字母、数字三种字符的任意组合方式
?![a-z0-9\W_]+$)排除小写字母、数字、特殊字符 三种的任意组合方式
(?![A-Za-z\W_]+$) 排除大写字母、小写字母、特殊字符三种的任意组合方式
(?![A-Z0-9\W_]+$) 排除大写字母、数字、特殊字符三种的任意组合方式
[a-zA-Z0-9\W_] 代表字符串由小写字母、大写字母、数字、特殊符号和下划线组成
排除任意三种方式组合的情况后,只剩下四种字符都有的情况
{8,32}代表字符串为8至32位
- 密码为8-32位,且至少包含大写字母、小写字母、数字、特殊符号(包含下划线)中的三种
^(?![a-zA-Z]+$)(?![A-Z\\d]+$)(?![A-Z_\\W]+$)(?![a-z\\d]+$)(?![a-z_\\W]+$)(?![\\d_\\W]+$)[a-zA-Z\\d_\\W]{8,32}$
解释:代表排除只包含大写字母、小写字母、数字、特殊符号中的一种和两种的情况,包含三种、四种的情况则匹配通过
其中 (?![a-zA-Z]+$) 代表排除大写字母、小写字母其中一种或两中组合的情况
(?![A-Z\d]+$) 代表排除大写字母、数字其中一种或两中的情况,其中\d可以用0-9代替
(?![A-Z_\W]+$) 代表排除大写字母、特殊字符一种或两种组合的情况
(?![a-z\d]+$)代表排除小写字母和数字一种或两种组合的情况
(?![a-z_\W]+$)代表排除小写字母、特殊字符一种或两种组合的情况
(?![\d_\W]+$)代表排除字母、特殊字符一种或两种组合的情况
一种和两种组合的情况都排除之后,就剩下三种和四种组合的情况了
3.密码为8-32位,且至少包含大写字母、小写字母、数字、特殊符号(包含下划线)中的两种
^(?![a-z]+$)(?![A-Z]+$)(?![\\W_]+$)(?![\\d]+$)[a-zA-Z\\d_\\W]{8,32}$
解释:与上面两个逻辑类似,排除所有单一字符情况后,剩下的就是两种组合、三种组合、四种组合的情况。
- 包含某类字符
1.包含大写字母匹配
(?=.*[A-Z])
2.包含小写字母匹配
(?=.*[a-z])
3.包含特殊字符或下划线匹配
//如果不匹配下划线可将后面的"_"去掉
(?=.*[\\W_])
- 包含数字匹配
(?=.*[\\d])