用于验证passwith的正则表达式允许特定的特殊字符

时间:2014-11-08 14:49:23

标签: regex validation passwords

我试图弄清楚将执行以下操作的正则表达式模式:

  • 在任何位置至少需要1个大写字符
  • 在任何位置至少需要1个小写字符
  • 在任何位置至少需要1位数
  • 允许(但不要求)特殊字符!$&在任何位置

任何帮助将不胜感激

应该有效的例子:

  • PASSW0RD
  • !Passw0rd1
  • 传递!w20rd

不应该起作用的例子:

  • !PASSW @ ord24
  • 密码
  • PASSW @ RD24
  • 密码

3 个答案:

答案 0 :(得分:0)

最简单的方法就是(有点天真,但应该有效,也许有更有效的方法):

([a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*)|
([a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*)|
([a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*)|
([a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*[0-0]+[a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*)|
([a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*)|
([a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*)

当然,必须根据您使用的语言将其调整为语言语法正则表达式。 在Java中:

    String regex = "([a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*)|"
        + "([a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*)|"
        + "([a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*)|"
        + "([a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*[0-0]+[a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*)|"
        + "([a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*)|"
        + "([a-zA-Z0-9!$&]*[a-z]+[a-zA-Z0-9!$&]*[0-9]+[a-zA-Z0-9!$&]*[A-Z]+[a-zA-Z0-9!$&]*)";

    String[] passList = new String[] { "Passw0rd", "!Passw0rd1", "Pass!w20rd", "!Passw@ord24", "password",
        "Passw@rd24", "Password" };
    for (String pass : passList)
    {
        System.out.print(pass + ": " + pass.matches(regex)+", ");
    }

输出:

Passw0rd: true, !Passw0rd1: true, Pass!w20rd: true, !Passw@ord24: false, password: false, Passw@rd24: false, Password: false

答案 1 :(得分:0)

如果有多个表达式是allowey,可以使用类似(perl语法)的内容:

if ($pw =~ /[^a-zA-Z0-9!\$&]/) {
    print "Usage of not allow characters.\n";
} else {
    if ($pw =~ /[a-z]/ && $pw =~ /[A-Z]/ && $pw =~ /\d/) {
        print "okay\n";
    } else {
        print "not okay\n";
    }       
}

适用于上述所有示例。

答案 2 :(得分:0)

这个应该有效:

^(?=[a-zA-Z0-9!$&]*\d)(?=[a-zA-Z0-9!&$]*[a-z])(?=[a-zA-Z0-9!&$]*[A-Z])[a-zA-Z0-9!&$]+$

您还可以将+更改为范围{4,}{4,50},以防止密码过小或/和密码过大。

相关问题