正则表达式以验证当前的DoD密码标准

时间:2011-09-13 16:04:10

标签: javascript regex

这里有两个不同的方法。

一:

^[a-zA-Z0-9\{\}:;,.?\-=+|<>!@#$%^&()\[\]\/\\)]{15,}

二:

(?=^.{15,}$)(?=.*\d{2,})(?=.*\W+)(?![.\n])(?=.*[A-Z]{2,})(?=.*[a-z]{2,}).*$

规则:
密码长度必须至少为15个字符 密码必须包含以下4个类别中至少2个字符:

  • 大写字母A-Z
  • 小写字母a-z
  • 数字0-9
  • 特殊字符{}:;,.?-=+|<>!@#$%^&()[]/\

密码不得包含任何空格。

感谢您的帮助。

----编辑----

尝试一些样品

2wsx@WSX3edc#EDC

3edc#EDC4rfv$RFV

nhy6NHY^mju7MJU&

1qaz!QAZ2wsx@WSX

我已经在http://www.gskinner.com/RegExr/对它们进行了测试,而我却没有让它们发挥作用。

我觉得下面的一些例子应该有效,但他们没有,或者我必须做错事。

4 个答案:

答案 0 :(得分:3)

为什么要在一个正则表达式中全部使用?做类似的事情:

if( length($password) >= 15 &&
    ($password =~ y/A-Z//) >= 2 &&
    ($password =~ y/a-z//) >= 2 &&
    ($password =~ y/0-9//) >= 2 &&
    ($password =~ y/{}:;,.?\-=+|<>!@#%^&()\[\]///) >= 2 &&
    $password =~ /^\S+$/ ) {

  print "password validates!\n";
} else {
  print "password doesn't validate!\n";
}

这种方式,当你必须添加更多标准时,这很容易做到。这也是一个比将它全部放在一个巨大的正则表达式中更具可读性和可维护性的地狱。

答案 1 :(得分:3)

要么一个接一个地检查这些正则表达式,要么从它们创建一个基于前瞻的大表达式。

<强>规则:

  • 密码长度必须至少为15个字符。
^.{15,}$

密码必须包含以下4个类别中至少2个字符:

  • 大写字母(A-Z)
^(.*?[A-Z]){2}
  • 小写字母(a-z)
^(.*?[a-z]){2}
  • 数字(0-9)
^(.*?[0-9]){2}
  • 特殊字符({}:;,.?-=+|<>!@#$%^&()[]/
^(.*?[{}:;,.?\-=+|!@#$%^&()\[\]/]){2}

密码不得包含任何空格。

为什么呢?但是如果必须,请将第一个表达式更改为

^\S{15,}$

答案 2 :(得分:0)

^(?!.* )(?=.{15})(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9])(?=.*[{}:;,.?\-=+|<>!@#$%\^&()[\]/\\].*[{}:;,.?\-=+|<>!@#$%\^&()[\]/\\])

我的正则表达式甚至可以用于分离的字符。例如, Ab0%Ab0%0000000000000 (您看,没有AA,两个A是分开的)。我已经逃避了最小数量的字符(仅^]

  • ^ Beginning of the string

  • (?!.* ) Not (any character repeated * times followed by a space)

  • (?=.{15}) Any character for 15 times (as it's written, even if there are other characters after the 15th it won't change anything)

  • (?=.*[A-Z].*[A-Z]) Any character repeated * times, an Upper Case letter, any character repeated * times, an Upper Case letter

  • (?=.*[a-z].*[a-z]) Any character repeated * times, a Lower Case letter, any character repeated * times, a Lower Case letter

  • (?=.*[0-9].*[0-9]) Any character repeated * times, a Digit, any character repeated * times, a Digit

  • (?=.*[{}:;,.?\-=+|<>!@#$%\^&()[\]/\\].*[{}:;,.?\-=+|<>!@#$%\^&()[\]/\\]) Any character repeated * times, a Symbol, any character repeated * times, a Symbol

所有子表达式都是零宽度前瞻(或零宽度负前瞻)并且它们在第一个字符处开始,因此它们都在“和”中,并且它们必须全部为真。

答案 3 :(得分:0)

我找到了答案....对于JavaScript ...感谢所有的帮助。

这个有效。

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