Java生成满足正则表达式的随机密码

生成随机密码,密码至少要包含 大写字母,小写字母,数字,特殊字符四者中的三种组合,并且不能包含中文,还要满足线程安全。

代码如下:

public class PasswordGenerator {

  private static final char[] CHARR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~!@#$%^&*.?-+=_"
      .toCharArray();
  private static final String PASSWORD_REGEX = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\\W_!@#$%^&*`~()-+=]+$)(?![0-9\\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]{8,16}$";
  private static final String NO_CHINESE_REGEX = "^[^\\u4e00-\\u9fa5]+$";
  private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX);
  private static final Pattern NO_CHINESE_PATTERN = Pattern.compile(NO_CHINESE_REGEX);

  public static String generatePassword(int length) {
    length = length < 8 ? 8 : length;
    length = length > 16 ? 16 : length;
    String result = getRandomPassword(length);
    Matcher m = PASSWORD_PATTERN.matcher(result);
    Matcher m1 = NO_CHINESE_PATTERN.matcher(result);
    if (m.matches() && m1.matches()) {
      return result;
    }
    return generatePassword(length);
  }

  private static String getRandomPassword(int length) {
    StringBuilder sb = new StringBuilder();
    ThreadLocalRandom r = ThreadLocalRandom.current();
    for (int x = 0; x < length; ++x) {
      sb.append(CHARR[r.nextInt(CHARR.length)]);
    }
    return sb.toString();
  }
}

为了实现线程安全,这里用到了ThreadLocalRandom,而非Random。保证了高并发场景下密码随机性。

密码的正则表达式以及js测试代码如下,可通过F12验证,当前正则指定了字符串长度为8-16位,你可以根据实际需求略做调整。

var pattern = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{8,16}$/;
console.log("匹配吗:"+pattern.test("Pas33332w0rd"));

注意:

部分同学私信我说用了我的代码,但是用了自己的正则会出现栈溢出的情况,这是因为你的正则包含了一些没在CHARR中出现的特殊符号,你需要修改CHARR,如果把那些特殊符号添加进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alphathur

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值