💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# Java 正则表达式密码验证示例 > 原文: [https://howtodoinjava.com/regex/how-to-build-regex-based-password-validator-in-java/](https://howtodoinjava.com/regex/how-to-build-regex-based-password-validator-in-java/) **密码验证**是当今几乎所有应用程序的需求。 通过手动编写所有内容以使用第三方可用的 API,可以通过多种方法来验证密码。 在此 **Java 正则表达式密码验证教程**中,我们正在使用[**正则表达式**](//howtodoinjava.com/java-regular-expression-tutorials/ "regular-expressions")构建**密码验证器**。 ## 1\. 用于密码验证的正则表达式 > `((?=.*[a-z])(?=.*d)(?=.*[@#$%])(?=.*[A-Z]).{6,16})` 上面的正则表达式有以下几节: ```java (?=.*[a-z])  : This matches the presence of at least one lowercase letter. (?=.*d)     : This matches the presence of at least one digit i.e. 0-9. (?=.*[@#$%]) : This matches the presence of at least one special character. ((?=.*[A-Z]) : This matches the presence of at least one capital letter. {6,16}       : This limits the length of password from minimum 6 letters to maximum 16 letters. ``` 前 4 个部分的顺序可以更改,甚至可以从最终正则表达式中删除。 这个事实可以用来以编程方式构建我们的密码验证器。 ## 2\. 使用正则表达式验证密码的 Java 程序 我们正在使验证器可配置,以便可以根据需要设置限制。 就像我们要强制使用至少一个特殊字符而不是任何大写字母一样,我们可以相应地传递所需的参数。 ```java package com.howtodoinjava.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PasswordValidator { private static PasswordValidator INSTANCE = new PasswordValidator(); private static String pattern = null; /** * No one can make a direct instance * */ private PasswordValidator() { //do nothing } /** * Force the user to build a validator using this way only * */ public static PasswordValidator buildValidator( boolean forceSpecialChar, boolean forceCapitalLetter, boolean forceNumber, int minLength, int maxLength) { StringBuilder patternBuilder = new StringBuilder("((?=.*[a-z])"); if (forceSpecialChar) { patternBuilder.append("(?=.*[@#$%])"); } if (forceCapitalLetter) { patternBuilder.append("(?=.*[A-Z])"); } if (forceNumber) { patternBuilder.append("(?=.*d)"); } patternBuilder.append(".{" + minLength + "," + maxLength + "})"); pattern = patternBuilder.toString(); return INSTANCE; } /** * Here we will validate the password * */ public static boolean validatePassword(final String password) { Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(password); return m.matches(); } } ``` ## 3\. 密码验证的单元测试 因此,我们的密码验证程序已准备就绪。 让我们用一些 [**JUnit**](https://howtodoinjava.com/junit-5-tutorial/ "junit") 测试用例进行测试。 ```java package com.howtodoinjava.regex; import junit.framework.Assert; import org.junit.Test; @SuppressWarnings("static-access") public class TestPasswordValidator { @Test public void testNormalPassword() { PasswordValidator validator = PasswordValidator.buildValidator(false, false, false, 6, 14); Assert.assertTrue(validator.validatePassword("howtodoinjava")); Assert.assertTrue(validator.validatePassword("howtodoin")); //Sort on length Assert.assertFalse(validator.validatePassword("howto")); } @Test public void testForceNumeric() { PasswordValidator validator = PasswordValidator.buildValidator(false,false, true, 6, 16); //Contains numeric Assert.assertTrue(validator.validatePassword("howtodoinjava12")); Assert.assertTrue(validator.validatePassword("34howtodoinjava")); Assert.assertTrue(validator.validatePassword("howtodo56injava")); //No numeric Assert.assertFalse(validator.validatePassword("howtodoinjava")); } @Test public void testForceCapitalLetter() { PasswordValidator validator = PasswordValidator.buildValidator(false,true, false, 6, 16); //Contains capitals Assert.assertTrue(validator.validatePassword("howtodoinjavA")); Assert.assertTrue(validator.validatePassword("Howtodoinjava")); Assert.assertTrue(validator.validatePassword("howtodOInjava")); //No capital letter Assert.assertFalse(validator.validatePassword("howtodoinjava")); } @Test public void testForceSpecialCharacter() { PasswordValidator validator = PasswordValidator.buildValidator(true,false, false, 6, 16); //Contains special char Assert.assertTrue(validator.validatePassword("howtod@injava")); Assert.assertTrue(validator.validatePassword("@Howtodoinjava")); Assert.assertTrue(validator.validatePassword("howtodOInjava@")); //No special char Assert.assertFalse(validator.validatePassword("howtodoinjava")); } } ``` 在这篇文章中,我们学习了使用 Java 正则表达式进行密码验证的方法,该规则能够验证字母数字和特殊字符,包括最大和最小密码长度。 学习愉快!