原文: https://howtodoinjava.com/regex/how-to-build-regex-based-password-validator-in-java/

密码验证是当今几乎所有应用程序的需求。 通过手动编写所有内容以使用第三方可用的 API,可以通过多种方法来验证密码。 在此 Java 正则表达式密码验证教程中,我们正在使用正则表达式构建密码验证器

1. 用于密码验证的正则表达式

((?=.*[a-z])(?=.*d)(?=.*[@#$%])(?=.*[A-Z]).{6,16})

上面的正则表达式有以下几节:

  1. (?=.*[a-z]) : This matches the presence of at least one lowercase letter.
  2. (?=.*d) : This matches the presence of at least one digit i.e. 0-9.
  3. (?=.*[@#$%]) : This matches the presence of at least one special character.
  4. ((?=.*[A-Z]) : This matches the presence of at least one capital letter.
  5. {6,16} : This limits the length of password from minimum 6 letters to maximum 16 letters.

前 4 个部分的顺序可以更改,甚至可以从最终正则表达式中删除。 这个事实可以用来以编程方式构建我们的密码验证器。

2. 使用正则表达式验证密码的 Java 程序

我们正在使验证器可配置,以便可以根据需要设置限制。 就像我们要强制使用至少一个特殊字符而不是任何大写字母一样,我们可以相应地传递所需的参数。

  1. package com.howtodoinjava.regex;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. public class PasswordValidator
  5. {
  6. private static PasswordValidator INSTANCE = new PasswordValidator();
  7. private static String pattern = null;
  8. /**
  9. * No one can make a direct instance
  10. * */
  11. private PasswordValidator()
  12. {
  13. //do nothing
  14. }
  15. /**
  16. * Force the user to build a validator using this way only
  17. * */
  18. public static PasswordValidator buildValidator( boolean forceSpecialChar,
  19. boolean forceCapitalLetter,
  20. boolean forceNumber,
  21. int minLength,
  22. int maxLength)
  23. {
  24. StringBuilder patternBuilder = new StringBuilder("((?=.*[a-z])");
  25. if (forceSpecialChar)
  26. {
  27. patternBuilder.append("(?=.*[@#$%])");
  28. }
  29. if (forceCapitalLetter)
  30. {
  31. patternBuilder.append("(?=.*[A-Z])");
  32. }
  33. if (forceNumber)
  34. {
  35. patternBuilder.append("(?=.*d)");
  36. }
  37. patternBuilder.append(".{" + minLength + "," + maxLength + "})");
  38. pattern = patternBuilder.toString();
  39. return INSTANCE;
  40. }
  41. /**
  42. * Here we will validate the password
  43. * */
  44. public static boolean validatePassword(final String password)
  45. {
  46. Pattern p = Pattern.compile(pattern);
  47. Matcher m = p.matcher(password);
  48. return m.matches();
  49. }
  50. }

3. 密码验证的单元测试

因此,我们的密码验证程序已准备就绪。 让我们用一些 JUnit 测试用例进行测试。

  1. package com.howtodoinjava.regex;
  2. import junit.framework.Assert;
  3. import org.junit.Test;
  4. @SuppressWarnings("static-access")
  5. public class TestPasswordValidator
  6. {
  7. @Test
  8. public void testNormalPassword()
  9. {
  10. PasswordValidator validator = PasswordValidator.buildValidator(false, false, false, 6, 14);
  11. Assert.assertTrue(validator.validatePassword("howtodoinjava"));
  12. Assert.assertTrue(validator.validatePassword("howtodoin"));
  13. //Sort on length
  14. Assert.assertFalse(validator.validatePassword("howto"));
  15. }
  16. @Test
  17. public void testForceNumeric()
  18. {
  19. PasswordValidator validator = PasswordValidator.buildValidator(false,false, true, 6, 16);
  20. //Contains numeric
  21. Assert.assertTrue(validator.validatePassword("howtodoinjava12"));
  22. Assert.assertTrue(validator.validatePassword("34howtodoinjava"));
  23. Assert.assertTrue(validator.validatePassword("howtodo56injava"));
  24. //No numeric
  25. Assert.assertFalse(validator.validatePassword("howtodoinjava"));
  26. }
  27. @Test
  28. public void testForceCapitalLetter()
  29. {
  30. PasswordValidator validator = PasswordValidator.buildValidator(false,true, false, 6, 16);
  31. //Contains capitals
  32. Assert.assertTrue(validator.validatePassword("howtodoinjavA"));
  33. Assert.assertTrue(validator.validatePassword("Howtodoinjava"));
  34. Assert.assertTrue(validator.validatePassword("howtodOInjava"));
  35. //No capital letter
  36. Assert.assertFalse(validator.validatePassword("howtodoinjava"));
  37. }
  38. @Test
  39. public void testForceSpecialCharacter()
  40. {
  41. PasswordValidator validator = PasswordValidator.buildValidator(true,false, false, 6, 16);
  42. //Contains special char
  43. Assert.assertTrue(validator.validatePassword("howtod@injava"));
  44. Assert.assertTrue(validator.validatePassword("@Howtodoinjava"));
  45. Assert.assertTrue(validator.validatePassword("howtodOInjava@"));
  46. //No special char
  47. Assert.assertFalse(validator.validatePassword("howtodoinjava"));
  48. }
  49. }

在这篇文章中,我们学习了使用 Java 正则表达式进行密码验证的方法,该规则能够验证字母数字和特殊字符,包括最大和最小密码长度。

学习愉快!