2012-03-29 125 views
4

我需要执行以下的口令策略:正则表达式对密码策略

至少9个字符,其中至少一个字符从各4 字符类(字母下和上壳体的;数字,符号)。

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

虽然我们在这里,有没有任何在线工具可以为这些类型的任务生成正则表达式?

谢谢!

+5

学习正则表达式有什么问题?国际海事组织,如果你想*避免*做/学习的东西,那么你在错误的网站。 – 2012-03-29 08:46:32

+0

正则表达式的一个很好的参考是在http://www.vogella.de/articles/JavaRegularExpressions/article.html。请张贴你已经尝试过的reg ex – 2012-03-29 08:47:05

+2

http://stackoverflow.com/questions/3387785/password-validation-regular-expression – cmbuckley 2012-03-29 08:47:07

回答

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

注意,这种模式不包括像ö特殊字符UTF。我不会在一个正则表达式中这样做。如果你想验证它,我会分解它并搜索每个东西。

+0

工作过,谢谢! – Michael 2012-03-29 08:58:08

+0

如果你在JavaScript的土地和使用jQuery我建议jQuery验证插件,这里是一个强大的密码的要点https://gist.github.com/mrgcohen/9806928 – 2014-03-27 12:56:37

+0

@mc如果您验证数据只在js端的一个应用程序,你根本没有安全。无论如何,服务器验证都必须执行。 – Dariusz 2015-04-17 09:48:44

-1

这里是产生正则表达式的在线工具:

http://regex.larsolavtorvik.com/

http://rubular.com/

+4

为了避免误解,这些工具不是用于*生成*表达式,而是用于*测试*它们。 – 2012-03-29 08:51:07

+0

是的,但可以通过跟踪和错误生成表达式。它是测试/使用表达式并了解它们的好方法。但在技术上你是对的;) – pascalvgemert 2012-03-29 08:53:12

+0

正则表达式必须开发,“生成”他们的踪迹和错误只是容易出错。 – stema 2012-03-29 08:56:15

0

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

9个字符 - 你可以正则表达式这一点,但。长度()> = 9时好多了!

对于角色职业,你应该使用一个公关类:

[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 
5

这是我会怎么做(使用正向前查找):

(?=.{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 

最后再说一句:这种方法的问题是,它不是很人性化。如果您要对用户作出明智回应,例如“密码缺少数字符号”,则需要再次执行该操作(以确定哪项要求失败)。