【问题标题】:Regular Expression for Password - does not begin with, does not contain密码的正则表达式 - 不以,不包含
【发布时间】:2014-04-10 20:34:22
【问题描述】:

我有一组密码复杂性要求,我正在解决这些要求,但在某些特定领域遇到了麻烦。我目前的表达如下:

^(?=(.*\d){2,4})(?=(.*[A-Z]))(?=(.*[a-z])).{8}$

这个表达式(据我所知并已测试)需要一个 8 个字符的密码,其中至少包含一个大写字母、一个小写字母和至少两个数字,但不超过 4 个。

我想实现的其余要求如下: - 包含至少 3 个不同的字母字符 - 不以数字开头 - 不包含特殊字符 - 不以三个相同的字符开头(即 aaa、ccc)。

我将不胜感激任何关于这些的帮助或指导。

【问题讨论】:

  • 如果您将其作为“正则表达式练习”进行,那很好,否则,正确的做法是使用带有不同测试的 validate() 方法检查所有要求。将来会更容易阅读和维护(以防您决定根据要求更改其中之一)。
  • 此外,鉴于如此庞大的限制列表,可能的密码集...有点偏小。

标签: regex passwords expression


【解决方案1】:

这行得通。
(注意 - 建议您也排除空格)

 # ^(?=.{8}$)(?!\d)(?=\PP*$)(?=(.)(?!\1\1))(?=.*[A-Z])(?=.*[a-z])(?=(?:\D*\d){2,4}\D*$)(?=.*([a-zA-Z]).*(?!\2)([a-zA-Z]).*(?!\2|\3)[a-zA-Z]).*$

 ^                            # BOS
 (?= .{8} $ )                 # 8 characters total
 (?! \d )                     # Not start with digit
 (?= \PP* $ )                 # No Punct (special chars?)
 (?=                          # Not start 3 identical chars
      ( . )                   # (1)
      (?! \1 \1 )
 )
 (?= .* [A-Z] )               # At least 1 upper
 (?= .* [a-z] )               # At least 1 lower
 (?=                          # At least 2 digits, no more than 4
      (?: \D* \d ){2,4}
      \D* $ 
 )
 (?=                          # At least 3 different alpha chars
      .* 
      ( [a-zA-Z] )            # (2)
      .* 
      (?! \2 )
      ( [a-zA-Z] )            # (3)
      .* 
      (?! \2 | \3 )
      [a-zA-Z] 
 )
 .* 
 $                            # EOS 

推荐 - RegexFormat4 阅读/维护代码。

Perl 测试用例

if( '~5bC$=6c' =~ /^(?=.{8}$)(?!\d)(?=\PP*$)(?=(.)(?!\1\1))(?=.*[A-Z])(?=.*[a-z])(?=(?:\D*\d){2,4}\D*$)(?=.*([a-zA-Z]).*(?!\2)([a-zA-Z]).*(?!\2|\3)[a-zA-Z]).*$/)
{
    print "Matched  $&\n";
}

输出>>

Matched  ~5bC$=6c

【讨论】:

  • 是 \Pp 的意思是 \pP?
  • @user3153407 - 已修复,应该是 \PP,即:不是标点符号
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2017-01-26
  • 2019-01-30
  • 1970-01-01
  • 2020-02-06
  • 2022-07-21
相关资源
最近更新 更多