1、题干
如果一个密码满足以下所有条件,我们称它是一个 强 密码:
- 它有至少
8
个字符。 - 至少包含 一个小写英文 字母。
- 至少包含 一个大写英文 字母。
- 至少包含 一个数字 。
- 至少包含 一个特殊字符 。特殊字符为:
"!@#$%^&*()-+"
中的一个。 - 它 不 包含
2
个连续相同的字符(比方说"aab"
不符合该条件,但是"aba"
符合该条件)。
给你一个字符串 password
,如果它是一个 强 密码,返回 true
,否则返回 false
。
示例 1:
输入:password = "IloveLe3tcode!"
输出:true
解释:密码满足所有的要求,所以我们返回 true 。
示例 2:
输入:password = "Me+You--IsMyDream"
输出:false
解释:密码不包含数字,且包含 2 个连续相同的字符。所以我们返回 false 。
示例 3:
输入:password = "1aB!"
输出:false
解释:密码不符合长度要求。所以我们返回 false 。
提示:
1 <= password.length <= 100
password
包含字母,数字和"!@#$%^&*()-+"
这些特殊字符。
2、思路1
简单的多个正则匹配,一个正则对应一个条件
3、代码
function strongPasswordCheckerII(password: string): boolean {
return !/(.)\1/.test(password) && [/.{8}/, /[a-z]/, /[A-Z]/, /\d/, /[!@#$%^&*()+-]/].every(r => r.test(password));
};
4、执行结果
5、思路2
复杂的单个正则匹配,再次把看了又忘忘了又看的 前瞻后顾
预习了一遍 🤡
至少 8 个字符:
/^.{8,}$/
至少包含一个小写字母:使用前瞻断言,限定整串字符的
pattern
是.*[a-z]
,具体正则为/^(?=.*[a-z]).{8,}$/
至少包含一个小写字母、一个大写字母:使用两个前瞻断言,限定整串字符的
pattern
必须同时满足.*[a-z]
与.*[A-Z]
,具体正则为/^(?=.*[a-z])(?=.*[A-Z]).{8,}$
,其他条件同理不包含 2 个连续相同的字符:使用否定前瞻断言,限定整串字符的
pattern
不能是.*(.)\1
,具体正则为/^(?!.*(.)\1).{8,}$/
完整正则为:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()+-])(?!.*(.)\1).{8,}$/
也能这样写:
/^(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()+-])(?!.*(.)\1).+$/
,一个前瞻断言对应一个条件
6、代码
function strongPasswordCheckerII(password: string): boolean {
return /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()+-])(?!.*(.)\1).{8,}$/.test(password);
};