正则表达式的使用
一、限定密码长度和保密程度的正则
至少8位长度,至少使用数字、字母、特殊字符中的两种:^(?=.*[a-zA-Z0-9])(?=.*[a-zA-Z\W_])(?=.*[0-9\W]).{8,}$
注:\w包含数字、字母、下划线,\W就不含下划线
数字:[0-9]或\d
字母:[a-zA-Z]
字符:[\W_]
解析:
1、(?=pattern)的用法:表达式pattern只作为一个查询条件,相当于加了一个额外必须满足的条件,但不参与正则匹配。并该表达式是匹配全文。
例如:匹配电话号码的正则是:^[0-9]{11}$,如果要判断电话号码里有没有5或者6,可以这么写:^(?=.*[56])[0-9]{11}$。
2、当有多个(?=pattern1)(?=pattern2),表达式应同时满足,即达到与的关系。
本例中,既是:第一表达式字母数字集合,则表达式要么有字母有么有数字,至少一个;但同时也要满足第二个表达式字母-非数字、字母集合;并且满足第三个表达式数字-非字母数字集合。
三个表达式相互影响,则达到目的-----至少两种字符。解析:密码只有一种字符,假如只有数字,那么本例中第一、第三个表达式,但是不满足第二个表达式,结果就是false。同样,如果自由字母,则第三个表达式不满足,只有特殊字符,则一个表达式不满足。只有同时有两种字符,才能同时满足三个表达式的要求。
3、长度的限定:因为(?=pattern)只是个判断条件,所以正真匹配的正则表达式是:.{8,},所以可以通过该子表达式进行长度限制。
4、(?=.*[a-zA-Z\W_]),该子表达式中的.*的解读:由于该表达式的每个子表达式都是从头开始匹配(具体原因不做细述),所以当第一个字符无法满足该子表达式的匹配条件时即会产生false,所以必须加上.*来跳过不满足的字符。
5、本例的条件是:数字、字母、特殊字符,三种中至少满足两种,用数学中的排列组合方式理解它。就有:在三种不同方式中任选两种的所有组合,将每种组合写出来,应是c(3,2),结果是3,每种组合都包含两种类型的密码。这种写法最终会因为标题2中的方式满足密码强度的要求;如果需要指定密码必须满足所有条件,而不是满足任意的写法:^(?=.*\d)(?=.*[a-zA-z])(?=.*[\W_]).{8,}$,这种的组合应是:三种不同方式选取任意一种进行组合,应是:c(3,1),结果也是3中组合,每种组合只包含一种密码;如果需要三种满足任意一种的写法:^(?=.*[a-zA-Z\d\W_]).{8,}$,这种组合应是:三种不同方式选取全部条件进行组合,应是:c(3,3)结果只有一种,每种组合包含全部密码。
三种密码方式,总结一下:
至少任意一种:^(?=[a-zA-Z\d\W_]).{8,}$ (一种的方式不需要加.*)
至少任意两种:^(?=.*[a-zA-Z0-9])(?=.*[a-zA-Z\W_])(?=.*[0-9\W_]).{8,}$
必须全部三种:^(?=.*\d)(?=.*[a-zA-z])(?=.*[\W_]).{8,}$
6、如果需要在四种密码方式中任意满足几种的写法是什么,将字母中的大小写看成两种密码方式。在此,我们类比三种密码方式的写法,使用组合的方式的推导。首先比较容易想到的:必须满足四种中全部4种的组合方式,应该是c(4,1)=4,满足四种的任意1种的组合方式,应该是c(4,4)=1。以此来推导,那么满足四种中的任意3种的组合方式,应该是c(4,2)=6,满足四种中2种的组合方式,应该是c(4,3)=4。
具体的写法:
至少任意一种:^(?=[a-zA-Z\d\W_]).{8,}$ (跟三种一样)
至少任意两种:^(?=.*[\da-zA-Z])(?=.*[\da-z\W_])(?=.*[\dA-Z\W_])(?=.*[a-zA-Z\W_]).{8,}$
至少任意三种:^(?=.*[\da-z])(?=.*[\dA-Z])(?=.*[\d\W_])(?=.*[A-Z\W_])(?=.*[a-zA-Z])(?=.*[a-z\W_]).{8,}$
必须全部四种:^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[\W_]).{8,}$
7、按照这种思路,如果想写两张密码方式的组合,或者更多中的密码方式的组合,只需要按照规律即可。不过,四种密码应该已经是常用最多的了。