1,正则表达式
密码强度的正则表达式
public static final String WEAK_PATTERN = "(^(?=.*[0-9])(?=.*[a-z])[0-9a-z]{6,18}$)|(^(?=.*[0-9])(?=.*[A-Z])[0-9A-Z]{6,18}$)";//全数字+字母(大/小)
public static final String MEDIUM_PATTERN = "((?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{6,18})|((?=.*[0-9])(?=.*[a-z])(?=.*[^\\w\\s]).{6,18})|((?=.*[0-9])(?=.*[A-Z])(?=.*[^\\w\\s]).{6,18})";//数字+字母(大+小)/数字+小+特殊字符/数字+大+特殊字符
public static final String STRONG_PATTERN = "(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[^\\w\\s]).{6,18}";//数字+字母(大+小)+特殊字符
我们定义密码至少有数字和字母,且最少6位最多18位,按照密码强弱层度分成了弱中强三种情况。
弱:是数字+字母(大/小),此时的字母要么全是大写,要么全是小写
中:数字+字母(大+小)/数字+小+特殊字符/数字+大+特殊字符,情况比较多分为三种情况 :
- 数字+字母(大写+小写):此时字母大小写同时存在
- 数字+小+特殊字符:数字+小写字母+特殊字符(比如@、¥、*等)的组合
- 数字+大+特殊字符:数字+大写字母+特殊字符的组合
强:数字+字母(大+小)+特殊字符,数字+字母大小写同时存在+特殊字符,最强密码
解析正则表达式
WEAK_PATTERN
( // 开始第一个正则表达式组
^ // 匹配字符串的开始位置
(?=.*[0-9]) // 正向先行断言,匹配至少一个数字
(?=.*[a-z]) // 正向先行断言,匹配至少一个小写字母
[0-9a-z]{6,18} // 匹配6-18个数字或小写字母的组合
$ // 匹配字符串的结束位置
) // 结束第一个正则表达式组
| // 或
( // 开始第二个正则表达式组
^ // 匹配字符串的开始位置
(?=.*[0-9]) // 正向先行断言,匹配至少一个数字
(?=.*[A-Z]) // 正向先行断言,匹配至少一个大写字母
[0-9A-Z]{6,18} // 匹配6-18个数字或大写字母的组合
$ // 匹配字符串的结束位置
) // 结束第二个正则表达式组
该正则表达式包含两个正则表达式组,用 |
进行分隔,表示匹配两种不同的密码格式,分别为:
- 至少包含一个数字和一个小写字母的6-18位密码;
- 至少包含一个数字和一个大写字母的6-18位密码。
每个正则表达式组都使用了正向先行断言,确保密码中至少包含指定的字符类型。然后使用字符集 [0-9a-z]
或 [0-9A-Z]
来匹配密码中的数字和字母。最后使用 {6,18}
来限制密码长度在6-18个字符之间,并使用 ^
和 $
分别表示匹配字符串的开始和结束位置。
MEDIUM_PATTERN
( // 开始第一个正则表达式组
(?=.*[0-9]) // 正向先行断言,匹配至少一个数字
(?=.*[a-z]) // 正向先行断言,匹配至少一个小写字母
(?=.*[A-Z]) // 正向先行断言,匹配至少一个大写字母
.{6,18} // 匹配6-18个任意字符
) // 结束第一个正则表达式组
| // 或
( // 开始第二个正则表达式组
(?=.*[0-9]) // 正向先行断言,匹配至少一个数字
(?=.*[a-z]) // 正向先行断言,匹配至少一个小写字母
(?=.*[^\w\s]) // 正向先行断言,匹配至少一个非单词字符和非空白字符
.{6,18} // 匹配6-18个任意字符
) // 结束第二个正则表达式组
| // 或
( // 开始第三个正则表达式组
(?=.*[0-9]) // 正向先行断言,匹配至少一个数字
(?=.*[A-Z]) // 正向先行断言,匹配至少一个大写字母
(?=.*[^\w\s]) // 正向先行断言,匹配至少一个非单词字符和非空白字符
.{6,18} // 匹配6-18个任意字符
) // 结束第三个正则表达式组
该正则表达式包含三个正则表达式组,用 |
进行分隔,表示匹配三种不同的密码格式,分别为:
- 包含数字、小写字母和大写字母的6-18位密码;
- 包含数字、小写字母和非单词字符和非空白字符的6-18位密码;
- 包含数字、大写字母和非单词字符和非空白字符的6-18位密码。
每个正则表达式组都使用了三个正向先行断言,确保密码中至少包含指定的字符类型。(?=.[0-9])
表示密码中至少包含一个数字,(?=.[a-z])
表示密码中至少包含一个小写字母,(?=.[A-Z])
表示密码中至少包含一个大写字母,(?=.[^\w\s])
表示密码中至少包含一个非单词字符和非空白字符。
最后使用 .{6,18}
来匹配密码中的任意字符,并限制密码长度在6-18个字符之间。
STRONG_PATTERN
( // 开始正则表达式组
?=.*[0-9] // 正向先行断言,匹配至少一个数字
(?=.*[a-z]) // 正向先行断言,匹配至少一个小写字母
(?=.*[A-Z]) // 正向先行断言,匹配至少一个大写字母
(?=.*[^\w\s]) // 正向先行断言,匹配至少一个非单词字符和非空白字符
.{6,18} // 匹配6-18个任意字符
) // 结束正则表达式组
该正则表达式用于匹配包含数字、小写字母、大写字母和非单词字符和非空白字符的6-18位密码。
该正则表达式使用正向先行断言,确保密码中至少包含指定的字符类型。?=.*[0-9]
表示密码中至少包含一个数字,?=.*[a-z]
表示密码中至少包含一个小写字母,?=.*[A-Z]
表示密码中至少包含一个大写字母,?=.*[^\w\s]
表示密码中至少包含一个非单词字符和非空白字符。
最后使用 .{6,18}
来匹配密码中的任意字符,并限制密码长度在6-18个字符之间。
2,使用方法
public static String checkStrength(String password) {
if (Pattern.matches(STRONG_PATTERN, password)) {
return "strong";
}else if (Pattern.matches(MEDIUM_PATTERN, password)) {
return "medium";
} else if (Pattern.matches(WEAK_PATTERN, password)) {
return "weak";
}else {
return "invalid";
}
}
public static void main(String[] args) {
while(true){
Scanner scan = new Scanner(System.in);
String password = scan.next();
String strength = checkStrength(password);
System.out.println("Password strength: " + strength);
}
}
测试结果
3,项目中使用效果