1. 需求

对用户密码的强度进行校验,要求用户密码达到一定的强度,符合安全性要求。

1.1. 基础版需求

密码必须由字母和数字组成(同时包括数字和数字);密码长度大于等于8个字符。

1.2. 进阶版需求

密码由这四种元素组成(数字、大写字母、小写字母、特殊字符),且必须包含全部四种元素;密码长度大于等于8个字符。

2. 基础版解析

需求:密码必须由字母和数字组成(同时包括数字和数字);密码长度大于等于8个字符。

2.1. 原理

使用正则表达式校验字符串。

正则表达式构建思路(负向预查模式):

  1. 字符为数字或字母;
  2. 不能全是数字;
  3. 不能全是字母;
  4. 字符数量大于等于8.

2.2. 核心代码

package org.example;import java.util.regex.Pattern;/** * 密码校验器。 */public class PasswordValidator {/** * 密码由数字和下划线组成,且大于等于8个字符。 */public static boolean isCharacterAndNumber(String password) {String pattern = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,}$";return Pattern.matches(pattern, password);}}

2.3. 正则表达式含义解析

含义正则表达式
字符串开头^
字符为数字或字母[0-9A-Za-z]
不全是数字(?![0-9]+$)
不全是字母(?![a-zA-Z]+$)
字符数量大于等于8{8,}
字符串结尾$

2.4. 测试用例

2.4.1. 示例代码

package org.example;public class TestBase {public static void main(String[] args) {isValid("");isValid("中文");isValid("abc-1234567");isValid("1234567");isValid("abc");isValid("zzz111");isValid("zzz12345");isValid("abc1234567");isValid("abc12345bbb");}private static void isValid(String text) {System.out.println(text + " === " + PasswordValidator.isCharacterAndNumber(text));}}

2.4.2. 运行结果

3. 进阶版解析

需求:密码由四种元素组成(数字、大写字母、小写字母、特殊字符),且必须包含全部四种元素;密码长度大于等于8个字符。

3.1. 原理

使用正则表达式校验字符串。

正则表达式构建思路(负向预查模式):

  1. 密码只包含数字、大写字母、小写字母和特殊字符
  2. 不全是 数字,或大写字母,或小写字母
  3. 不全是 数字,或大写字母,或特殊字符
  4. 不全是 数字,或小写字母,或特殊字符
  5. 不全是 大写字母,或小写字母,或特殊字符
  6. 字符数量大于等于8.

3.2. 核心代码

import java.util.regex.Pattern;/** * 密码校验器。 */public class PasswordValidator {/** * 密码由四种元素组成(数字、大写字母、小写字母、特殊字符),且必须包含全部四种元素;密码长度大于等于8个字符。 */public static boolean isValid(String password) {// 正则表达式的内容如下:// ^(" />?,./]{8,}$// 在 Java 中使用,需要转义;转义后的结果如下。String pattern = "^(?![0-9A-Za-z]+$)(?![0-9A-Z\\W]+$)(?![0-9a-z\\W]+$)(?![A-Za-z\\W]+$)[0-9A-Za-z~!@#$%^&*()_+`\\-={}|\\[\\]\\\\:\";'?,./]{8,}$";return Pattern.matches(pattern, password);}}

3.3. 正则表达式含义解析

含义正则表达式
字符串开头^
密码只包含数字、大写字母、小写字母和特殊字符[0-9A-Za-z~!@#$%^&*()_+`-={}|[]\:”;’?,./]
不全是 数字,或大写字母,或小写字母(?![0-9A-Za-z]+$)
不全是 数字,或大写字母,或特殊字符(?![0-9A-Z\W]+$)
不全是 数字,或小写字母,或特殊字符(?![0-9a-z\W]+$)
不全是 大写字母,或小写字母,或特殊字符(?![A-Za-z\W]+$)
字符数量大于等于8{8,}
字符串结尾$

3.4. 测试用例

3.4.1. 示例代码

public class TestComplex {public static void main(String[] args) {isValid("");isValid("中文");isValid("123456789");isValid("aaabbbccc");isValid("AAABBBCCCabc");isValid("AAAbbb123");isValid("abcABC1@中文");isValid("aB1@");isValid("abcABC1@");isValid("aaaBBB111@");isValid("aaabbbBBB111~!@#$%^&*()_+=-`{}|[]\\:\";'?,./");}private static void isValid(String text) {System.out.println(text + " === " + PasswordValidator.isValid(text));}}

3.4.2. 运行结果

4. Gitee示例项目(idea)

密码校验器Demo

5. 参考

java正则校验,密码必须由字母和数字组成

几种常见的密码校验正则表达式