Java正则校验密码至少包含:字母数字特殊符号中的2种

时间:2025-02-15 10:22:44
/** * 假定设置密码时,密码规则为: 字母、数字、特殊符号,至少匹配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+$"; 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; System.out.println("字符串:" + targetString + ",是否符合规则:" + isLegal); System.out.println("---------------"); return isLegal; } public static void main(String[] args) { checkPassword("fasdagd"); checkPassword("41234123"); checkPassword("#$%^&&*("); checkPassword("fasd$$"); checkPassword("41234%%%"); checkPassword("fasd41^(324"); checkPassword("fa413%^&*"); checkPassword("&%fa413%^&*"); }