密码策略的正则表达式

时间:2012-03-29 08:44:22

标签: regex passwords

我需要执行以下密码策略:

  

至少9个字符,每个字符至少有一个字符   字符类(字母大写和小写;数字,符号)。

任何正则表达专家都可以在这里帮忙吗? (我正在使用Java正则表达式引擎)

虽然我们正在使用它,是否有任何可以为这类任务生成正则表达式的在线工具?

谢谢!

3 个答案:

答案 0 :(得分:10)

(?=.{9,})(?=.*?[^\w\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*

请注意,此模式不包含ö之类的特殊字符。我不会在一个正则表达式中这样做。如果你想验证它,我会拆分并搜索每一件事。

答案 1 :(得分:6)

以下是我将如何做到这一点(使用正向前瞻):

(?=.{9,})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\p{Punct}).*

完整示例和测试:

                       //    Regexp                Description
Pattern p = Pattern.compile("(?=.{9,})"   +     // "" followed by 9+ symbols
                            "(?=.*[a-z])" +     // --- ' ' --- at least 1 lower
                            "(?=.*[A-Z])" +     // --- ' ' --- at least 1 upper
                            "(?=.*[0-9])" +     // --- ' ' --- at least 1 digit
                            "(?=.*\\p{Punct})"+ // --- ' ' --- at least 1 symbol
                            ".*");              // the actual characters
String[] tests = {
        "aB99",         // too short
        "abcdefghijk",  // missing A
        "abcdefGHIJK",  // missing 5
        "12345678910",  // missing a
        "abcDEF12345",  // missing punct
        "abcDEF-2345"   // works!
};

for (String s : tests) {
    boolean matches = p.matcher(s).matches();
    System.out.printf("%-12s: %b%n", s, matches);
}

<强>输出:

aB99        : false
abcdefghijk : false
abcdefGHIJK : false
12345678910 : false
abcDEF12345 : false
abcDEF-2345 : true

最后评论:这种方法的问题在于它不是非常用户友好。如果要对用户做出明智的回应,例如“密码缺少数字符号”,则需要再次进行工作(以确定哪个要求失败)。

答案 2 :(得分:0)

我会使用多个正则表达式来解决这个问题:

9个字符 - 你可以重复这个但是.length()&gt; = 9要好得多!

对于角色类,您应该使用一个pr类:

[a-z]+
[A-Z]+
[0-9]+
[£$%&{[...]+ //all the possible symbols you want to accept
or perhaps: 
[:punct:]+ // this depends on your programming language..
or like in the suggestion by @david-halter:
[^\w\s]+  // not alphanumeric or spaces