You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:18:03