跳到主要内容

2299.强密码检验器 II

· 阅读需 3 分钟

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、执行结果

image.png

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);
};

7、执行结果

image.png