如何编写以任意顺序匹配两个或多个字符的正则表达式?

时间:2018-12-26 03:03:24

标签: javascript regex

尝试使我的正则表达式适用于以下规则:

  • 总共至少8个字符。
  • 不大于21。
  • 应包含至少两个大写字母
  • 应包含至少两个小写字母
  • 应至少包含两个数字
  • 应至少包含两个符号!@#$%^&*()
  • 所有字符可以任意排列,不必重复排列。
  • (添加了Edit)不能包含上面未指定的任何其他字符。

我认为这个正则表达式很接近,但是不能正常工作。

/^(?=(?:\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}$/

2 个答案:

答案 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)如果可以的话,您甚至可能不需要针对该特定规则的正则表达式-有时经典的字符串扫描会更简单,通常会更快。