尝试使我的正则表达式适用于以下规则:
我认为这个正则表达式很接近,但是不能正常工作。
/^(?=(?:\D*\d){2,}\D*$)(?=(?:[^a-z]*[a-z]){2,}[^a-z]*$)(?=(?:[^A-Z]*[A-Z]){2,}[^A-Z]*$)(?=(?:[^!@#$%^&*]*[!@#$%^&*]){2,}[^!@#$%^&*]*$)[a-zA-Z0-9!@#$%^&*]{8,21}$/
答案 0 :(得分:1)
使用适当的语法提前行:
^(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9])(?=.*[!@#$%^&*()].*[!@#$%^&*()])[a-zA-Z0-9!@#$%^&*]{8,21}$
以您正在做的事为例:
(?=(?:[^a-z]*[a-z]){2,}[^a-z]*$)
这表示要从密码的开始匹配任意数量的非小写字母,然后是小写字母,相同的先行两次。请记住,先行声明有效,但不匹配或不移动,因此您只检查了一个小写字母两次。要检查至少两个小写字母,请使用:
(?=.*[a-z].*[a-z])
这会检查密码中任何地方的两个小写字母。
答案 1 :(得分:1)
我会弯腰,猜想您被要求“产生可验证应用程序密码的正则表达式”。
1)阅读Password Rules Are Bullshit。查看您是否可以说服领导,团队或客户更改这些规则(总额)。特别是,将最大长度增加到至少32,然后放下其他规则。
2)我已经知道您可能无法做到这一点,因此至少 做到这一点,以便您的应用程序可以清楚地解释哪个密码规则被打破。依次对每个规则进行单独的检查(如建议的Lancelod),并为每个规则提供清晰的面向用户的失败消息。
3)如果可以的话,您甚至可能不需要针对该特定规则的正则表达式-有时经典的字符串扫描会更简单,通常会更快。