一、限定密码长度和保密程度的正则
至少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只作为一个查询条件,类似于判断,并不是真正的表达式对字符串的匹配。
例如:判断字符串是否包含001,匹配test001的正则表达式,应是:^test(?=001|002)001$,或^test(?=001|002).*$,即表达式要满足字符串的数量和字符类型的要求。
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、按照这种思路,如果想写两张密码方式的组合,或者更多中的密码方式的组合,只需要按照规律即可。不过,四种密码应该已经是常用最多的了。