验证密码的复杂度:密码规则为: 字母、数字、特殊符号,至少匹配2种

发布时间 2023-08-16 17:22:45作者: 初·陽
package com.guochuang.gov.dc.common.util;

import java.util.Scanner;
import java.util.regex.Pattern;

public class PasswordCheckUtil {

/**
* 假定设置密码时,密码规则为: 字母、数字、特殊符号,至少匹配2种
* 则密码可能出现的情况有:
* 1、数字+特殊符号
* 2、字母+特殊符号
* 3、字母+数字
* 4、字母+数字+特殊符号
* (组合与顺序无关)
* 解决思路:
* 1、遍历字符串的字符数组,查看是否包含目标特殊字符,若包含,则标记字符串
* 包含特殊字符,并替换当前特殊字符为''。
* 2、判断剩下的字符组成的字符串,是否匹配以下情况
* - 纯字母
* - 纯数字
* - 字母+数字
* 3、字符串匹配规则
* 纯字母+包含特殊字符 ---- 匹配通过
* 纯数字+包含特殊字符 ---- 匹配通过
* 字母+数字+包含个数字符 ---- 匹配通过
*/
//特殊字符
public static final String SPEC_CHARACTERS = " !\"#$%&'()*+,-./:;<=>?@\\]\\[^_`{|}~";
// 纯字母
public static final String character = "[a-zA-Z]{1,}$";
// 纯数字
public static final String numberic = "[0-9]{1,}$";
// 字母和数字
public static final String number_and_character = "((^[a-zA-Z]{1,}[0-9]{1,}[a-zA-Z0-9]*)+)" +
"|((^[0-9]{1,}[a-zA-Z]{1,}[a-zA-Z0-9]*)+)$";
// 字母或数字
public static final String number_or_character = "[a-zA-Z0-9]+$";
// 字母数字下划线
public static final String ncw = "\\w+$";

//字母、数字、特殊符号,至少匹配2种
public static final String regex = "^((?=.*[a-zA-Z])(?=.*[0-9])|(?=.*[0-9])(?=.*[^a-zA-Z0-9])|(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9])|(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])).*$";


/**
* 验证密码的复杂度
*
* @param targetString 要验证的密码
* @return 如果密码符合复杂度要求,返回true;否则返回false
*/
public static boolean checkPassword(String targetString) {
String opStr = targetString;
boolean isLegal = false;
boolean hasSpecChar = false;
char[] charArray = opStr.toCharArray();
for (char c : charArray) {
if (SPEC_CHARACTERS.contains(String.valueOf(c))) {
hasSpecChar = true;
// 替换此字符串
opStr = opStr.replace(c, ' ');
}
}
String excSpecCharStr = opStr.replace(" ", "");
boolean isPureNum = Pattern.compile(numberic).matcher(excSpecCharStr).matches();
boolean isPureChar = Pattern.compile(character).matcher(excSpecCharStr).matches();
boolean isNumAndChar = Pattern.compile(number_and_character).matcher(excSpecCharStr).matches();
isLegal = ((isPureNum && hasSpecChar)
|| (isPureChar && hasSpecChar) || isNumAndChar && hasSpecChar) || isNumAndChar;
return isLegal;
}


/**
* 验证密码的复杂度
*
* @param password 要验证的密码
* @return 如果密码符合复杂度要求,返回true;否则返回false
*/
public static boolean isPasswordComplex(String password) {
// 正则表达式,用于匹配至少包含两种不同类型的字符的密码
Pattern pattern = Pattern.compile(regex);
return pattern.matcher(password).matches();
}


public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

boolean isOk = false;

while (!isOk){
System.out.println("请输入密码:");

String password = scanner.nextLine(); // 替换为你要验证的密码

isOk = isPasswordComplex(password);

System.out.println(isOk);

}

scanner.close();
}
}