用于复杂密码验证的单一正则表达式

时间:2013-08-30 09:58:28

标签: regex

我必须验证密码才能符合这些规则

A)密码必须包含以下4个类中的3个字符:

  1. 英文大写字母A,B,C,... Z
  2. 英文小写字母a,b,c,... z
  3. 西化阿拉伯数字0,1,2,... 9
  4. 非字母数字(“特殊字符”) 例如,标点符号。 {},。<>;:'?/ |`〜!@#$%^& *()_- + = space
  5. B)密码长度必须至少为8个字符;

    这可以在一个正则表达式中完成。那个正则表达式会是什么?

4 个答案:

答案 0 :(得分:5)

此任务不适合使用正则表达式。

可以以正则表达式完成,但它会如此复杂和复杂,以至于你最好以其他方式进行检查。

仅仅因为使用正则表达式可以完成某些事情并不意味着这是一个好主意。

答案 1 :(得分:0)

我认为使用复杂的正则表达式不是应该不惜一切代价使用的方法。在这种情况下,使用带有四个布尔值的简单方法将更容易编写,更易于阅读,也可能更快。

答案 2 :(得分:0)

你可以检查它是:

  • 不是纯粹的数字和字母数字(这比你的条件说的更激进);
  • 不是纯粹的小写和特殊字符

要检查此内容的单个正则表达式将类似于

(?![A-Za-z0-9]+$|[a-z{},.<>;:'?/|`~!@#$%^&*()_-+= -]+$).{8,}

我故意忽略了您的确切规格。特别是,我不想允许Pass1234,我认为设置最大长度没有意义,我根本没有限制允许的字符集(即有最低要求,但是如果你愿意,你可以疯狂地使用控制字符或重音字符。如果您不同意,这些事情很容易解决。

要严格执行您的规范,您可以检查密码是否仅包含任何两个组;所以不是所有的大写和小写,而不是所有的小写和数字,而不是所有的大写和数字,而不是所有的数字和特殊,而不是所有的小写和特殊,而不是所有的大写和特殊,但再次,这有点乏味和恕我直言反效果。

您并未说明您正在使用哪种正则表达式。我假设您有Perl负面预测(?!...)可供您使用。如果您受限于传统的BRE或ERE语法,这将更加困难。

答案 3 :(得分:-1)

我认为您使用单个正则表达式可以获得非常接近的结果。这是一个例子:

^((= * [@#$%&安培;!?,()_ = / \ \ - \ * \ + \]?!)[A-ZA-Z0-9 @#$%&安培;?,()_ = / \ \ - \ * \ + \] {8,20})$

这说:

  • 至少1个控制角色
  • 可以包含字母数字字符
  • 长度介于8到20个字符之间