我需要强制执行以下密码策略:
至少9个字符,每个4个字符类中至少有一个字符(字母大写和小写;数字,符号).
任何正则表达式专家都可以在这里帮忙吗?(我正在使用Java正则表达式引擎)
虽然我们正在使用它,是否有任何可以为这类任务生成正则表达式的在线工具?
谢谢 !
Dav*_*ter 10
(?=.{9,})(?=.*?[^\w\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*
Run Code Online (Sandbox Code Playgroud)
请注意,此模式不包含特殊的utf字符ö.我不会在一个正则表达式中这样做.如果你想验证它,我会拆分并搜索每一件事.
这是我将如何做到这一点(使用正向前瞻):
(?=.{9,})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\p{Punct}).*
Run Code Online (Sandbox Code Playgroud)
完整示例和测试:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
aB99 : false
abcdefghijk : false
abcdefGHIJK : false
12345678910 : false
abcDEF12345 : false
abcDEF-2345 : true
Run Code Online (Sandbox Code Playgroud)
最后评论:这种方法的问题在于它不是非常用户友好.如果要对用户做出明智的回应,例如" 密码缺少数字符号 ",则需要再次进行工作(以确定哪个要求失败).