原文: https://howtodoinjava.com/regex/how-to-build-regex-based-password-validator-in-java/
密码验证是当今几乎所有应用程序的需求。 通过手动编写所有内容以使用第三方可用的 API,可以通过多种方法来验证密码。 在此 Java 正则表达式密码验证教程中,我们正在使用正则表达式构建密码验证器。
1. 用于密码验证的正则表达式
((?=.*[a-z])(?=.*d)(?=.*[@#$%])(?=.*[A-Z]).{6,16})
上面的正则表达式有以下几节:
(?=.*[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 程序
我们正在使验证器可配置,以便可以根据需要设置限制。 就像我们要强制使用至少一个特殊字符而不是任何大写字母一样,我们可以相应地传递所需的参数。
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 测试用例进行测试。
package com.howtodoinjava.regex;import junit.framework.Assert;import org.junit.Test;@SuppressWarnings("static-access")public class TestPasswordValidator{@Testpublic void testNormalPassword(){PasswordValidator validator = PasswordValidator.buildValidator(false, false, false, 6, 14);Assert.assertTrue(validator.validatePassword("howtodoinjava"));Assert.assertTrue(validator.validatePassword("howtodoin"));//Sort on lengthAssert.assertFalse(validator.validatePassword("howto"));}@Testpublic void testForceNumeric(){PasswordValidator validator = PasswordValidator.buildValidator(false,false, true, 6, 16);//Contains numericAssert.assertTrue(validator.validatePassword("howtodoinjava12"));Assert.assertTrue(validator.validatePassword("34howtodoinjava"));Assert.assertTrue(validator.validatePassword("howtodo56injava"));//No numericAssert.assertFalse(validator.validatePassword("howtodoinjava"));}@Testpublic void testForceCapitalLetter(){PasswordValidator validator = PasswordValidator.buildValidator(false,true, false, 6, 16);//Contains capitalsAssert.assertTrue(validator.validatePassword("howtodoinjavA"));Assert.assertTrue(validator.validatePassword("Howtodoinjava"));Assert.assertTrue(validator.validatePassword("howtodOInjava"));//No capital letterAssert.assertFalse(validator.validatePassword("howtodoinjava"));}@Testpublic void testForceSpecialCharacter(){PasswordValidator validator = PasswordValidator.buildValidator(true,false, false, 6, 16);//Contains special charAssert.assertTrue(validator.validatePassword("howtod@injava"));Assert.assertTrue(validator.validatePassword("@Howtodoinjava"));Assert.assertTrue(validator.validatePassword("howtodOInjava@"));//No special charAssert.assertFalse(validator.validatePassword("howtodoinjava"));}}
在这篇文章中,我们学习了使用 Java 正则表达式进行密码验证的方法,该规则能够验证字母数字和特殊字符,包括最大和最小密码长度。
学习愉快!
