2017-09-01 66 views
2

Regex的密码验证我有密码验证的规则如下:为组规则

  • 至少8个字符
  • 至少1个大写字母
  • 至少3小写字母
  • 至少1号
  • 至少1个特殊字符
  • 起始字符必须是字母(大写或小写)
  • 行中最多2个相同的字符 (例如Passs123!应该是无效的,但sPass123!有效)

我试图找到正则表达式这个规则,最接近的是这样的:

/^(?=.*[0-9]) (?=.*[[email protected]#$%^&*]) (?=.*[a-z]) (?=.*[A-Z]) {8} $/ 

,但它并不适用于所有的规则工作。

我是新来的正则表达式,我也很欣赏任何资源,我可以学习正则表达式。

回答

3

您可以考虑以下几种模式:

^(?=.*[0-9])(?=.*[^\w\s])(?=(?:[^a-z]*[a-z]){3})(?=.*[A-Z])(?!.*(.)\1{2})[a-zA-Z].{7,}$ 

regex demo(注意\n加入到[^a-z]仅用于测试演示目的,以免在一个多输入跨行溢出)。

详细

  • ^ - 字符串的开始
  • (?=.*[0-9]) - 1位数
  • (?=.*[^\w\s]) - 任何1个特殊字符(不发一言,也没有空格字符)(注:如果你只是想从列表中请求特殊字符,使用原始模式中的(?=.*[[email protected]#$%^&*])
  • (?=(?:[^a-z]*[a-z]){3}) - 3个小写字母
  • (?=.*[A-Z]) - 1个大写字母
  • (?!.*(.)\1{2}) - 不相同的3个连续字符
  • [a-zA-Z] - 第一字符是字母
  • .{7,} - 然后7+字符
  • $ - 串的端

要了解有关密码验证的更多信息,请参阅Lookahead Example: Simple Password Validation

请注意,您可以通过使用principle of contrast增强向前看符号检查:用(?=[^0-9]*[0-9])取代(?=.*[0-9])(?=.*[A-Z])(?=[^A-Z]*[A-Z])(?=.*[^\w\s])(?=[\w\s]*[^\w\s])

+0

条件'3小写字母'不起作用。 'PASS123! '匹配正则表达式。 – ikleschenkov

+0

@ikleschenkov它的工作原理,仅在因为'[^ a-z]'构造也符合换行符而在演示中不起作用。这里是一个更合适的链接 - https://regex101.com/r/g4gptV/2,其中'[^ a-z]'变成'[^ \ na-z]'只是因为演示包含单个多元化字符串。在真实情况下,这些行是独立的字符串。 –

+0

@WiktorStribiżew我从你的解决方案中学到了很多东西。 +1总是很好地解释它:-) – Gurman