带特殊字符的Java密码校验器实现问题咨询
无正则实现Java密码校验方案
不用正则的话,通过基础的字符遍历和Character类的内置方法就能实现所有校验规则,实现逻辑如下:
前置准备
首先定义好允许的特殊字符集合,以及各规则的达标标记位:
- 允许的特殊字符直接用字符串存储:
String allowedSpecial = "$#?!_-=%"; - 为每个校验规则设置布尔类型的标记位,默认值为
false代表未达标
各规则校验逻辑
规则1(长度≥8)
直接判断输入密码的长度即可:
// password为接收的用户输入密码 boolean lenOk = password.length() >= 8;
规则2(同时包含大小写字母)
遍历每个字符,分别记录是否出现过大写、小写字母,最后判断两个标记同时为true即可:
boolean hasUpper = false; boolean hasLower = false; for (int i = 0; i < password.length(); i++) { char c = password.charAt(i); if (Character.isUpperCase(c)) hasUpper = true; if (Character.isLowerCase(c)) hasLower = true; } boolean hasUpperAndLower = hasUpper && hasLower;
规则3(至少一处字母后紧跟数字)
遍历的时候同时取当前字符和下一个相邻字符判断,只要存在任意一组符合要求就标记达标:
boolean hasLetterFollowDigit = false; // 遍历到倒数第二个字符即可,避免取i+1时数组越界 for (int i = 0; i < password.length() - 1; i++) { char current = password.charAt(i); char next = password.charAt(i + 1); // 当前是字母、下一个是数字即满足要求 if (Character.isLetter(current) && Character.isDigit(next)) { hasLetterFollowDigit = true; break; // 找到符合的组合后可以提前结束遍历 } }
规则4(包含指定特殊字符)
遍历每个字符,判断是否存在于提前定义的特殊字符列表中:
boolean hasSpecial = false; for (int i = 0; i < password.length(); i++) { char c = password.charAt(i); // indexOf返回-1代表字符不在特殊字符列表中 if (allowedSpecial.indexOf(c) != -1) { hasSpecial = true; break; } }
完整校验代码示例
可以把多次遍历合并成一次,提升运行效率,完整可运行代码如下:
import java.util.Scanner; public class PasswordChecker { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入密码:"); String password = scanner.nextLine(); scanner.close(); String allowedSpecial = "$#?!_-=%"; boolean lenOk = password.length() >= 8; boolean hasUpper = false; boolean hasLower = false; boolean hasLetterFollowDigit = false; boolean hasSpecial = false; // 一次遍历完成所有规则判断 for (int i = 0; i < password.length(); i++) { char c = password.charAt(i); // 大小写判断 if (Character.isUpperCase(c)) hasUpper = true; if (Character.isLowerCase(c)) hasLower = true; // 特殊字符判断 if (allowedSpecial.indexOf(c) != -1) hasSpecial = true; // 字母后跟数字判断,避免索引越界 if (i < password.length() - 1) { char next = password.charAt(i + 1); if (Character.isLetter(c) && Character.isDigit(next)) { hasLetterFollowDigit = true; } } } boolean hasUpperAndLower = hasUpper && hasLower; // 输出校验结果 if (lenOk && hasUpperAndLower && hasLetterFollowDigit && hasSpecial) { System.out.println("密码符合合规要求"); } else { System.out.println("密码不符合要求,问题如下:"); if (!lenOk) System.out.println("- 密码长度不能少于8个字符"); if (!hasUpperAndLower) System.out.println("- 密码需要同时包含大写和小写英文字母"); if (!hasLetterFollowDigit) System.out.println("- 密码需要至少存在一处字母后紧跟数字的组合"); if (!hasSpecial) System.out.println("- 密码需要包含$#?!_-=%中的任意一个特殊字符"); } } }
内容的提问来源于stack exchange,提问作者pizzawithpineapple
相关产品推荐
相关产品推荐

