如何简化Java密码校验正则代码 优化JLabel合规状态颜色提示逻辑
优化方案
核心思路是把重复的校验逻辑抽离,将校验规则与对应UI标签绑定,消除冗余的if-else代码,同时修正原实现中与需求不符的逻辑问题。
主要优化点
- 把4项密码校验规则、对应提示标签、展示文本统一存入规则列表,无需为每个规则单独写判断逻辑
- 修正原正则的逻辑漏洞:原正则要求4种字符类型全部命中,与需求「至少满足3种」不符
- 替换废弃API:
JPasswordField.getText()已被标记为过时,改用getPassword()获取密码内容 - 所有固定提示文本只定义一次,无需重复赋值
优化后代码
import java.awt.Color; import java.util.regex.Pattern; import javax.swing.JLabel; import javax.swing.JOptionPane; // 先定义校验规则结构体,Java 16+可用record,低版本可以单独写个类或者用Object数组替代 record PasswordRule(String regex, JLabel label, String tip) {} private void JB_MostrarActionPerformed(java.awt.event.ActionEvent evt) { String password = new String(jPasswordField_pass.getPassword()).trim(); final String LENGTH_REGEX = "^\\S{8,64}$"; // 初始化校验规则列表,后续新增规则只需在这里加项即可 PasswordRule[] rules = { new PasswordRule(".*\\d.*", jLabel_infopass3, "numbers (0-9)"), new PasswordRule(".*[a-z].*", jLabel_infopass2, "lowercase (a-z)"), new PasswordRule(".*[A-Z].*", jLabel_infopass1, "uppercase (A-Z)"), new PasswordRule(".*[@#$%^&+!.,].*", jLabel_infopass4, "symbols (e.g. #, $, !, @, ^, &, *, etc)") }; // 固定提示文本提前赋值 final String INFO_TIP = "Your password must be between 8 and 64 characters long. It must contain at least three (3) of the below:"; jLabel_infopass.setText(INFO_TIP); // 空密码判断 if (password.isEmpty()) { jl_Error.setText("Please enter your Password."); jl_Error.setForeground(Color.RED); return; } jl_Error.setText(""); // 清空错误提示 // 长度校验不通过直接提示 if (!Pattern.matches(LENGTH_REGEX, password)) { jLabel_infopass.setForeground(Color.RED); return; } // 遍历校验所有规则,统计命中数量 int matchCount = 0; for (PasswordRule rule : rules) { boolean isMatch = Pattern.matches(rule.regex(), password); rule.label().setText(rule.tip()); rule.label().setForeground(isMatch ? Color.BLACK : Color.RED); if (isMatch) matchCount++; } // 判断是否满足至少3项要求 if (matchCount >= 3) { jLabel_infopass.setForeground(Color.BLACK); JOptionPane.showMessageDialog(null, password); } else { jLabel_infopass.setForeground(Color.RED); } }
如果是Java 16以下的版本不支持record,可以把规则用Object数组替换,对应遍历逻辑稍作调整即可:
Object[][] rules = { {".*\\d.*", jLabel_infopass3, "numbers (0-9)"}, {".*[a-z].*", jLabel_infopass2, "lowercase (a-z)"}, {".*[A-Z].*", jLabel_infopass1, "uppercase (A-Z)"}, {".*[@#$%^&+!.,].*", jLabel_infopass4, "symbols (e.g. #, $, !, @, ^, &, *, etc)"} }; // 遍历时强转即可 for (Object[] rule : rules) { String regex = (String) rule[0]; JLabel label = (JLabel) rule[1]; String tip = (String) rule[2]; // 后续校验逻辑和上面一致 }
内容的提问来源于stack exchange,提问作者wicked
相关产品推荐
相关产品推荐

