Java中用于密码验证的正则表达式

密码验证对于保护用户帐户至关重要,在 Java 中使用正则表达式(regex) 提供了一种强大且动态的方式来对密码复杂性施加特定标准。

在本教程中,我们将深入研究如何利用正则表达式进行基于 Java 的密码验证过程。

强健密码的标准
在讨论代码之前,我们将确定强密码的构成要素。理想的密码应该:

  • 有八个或更多字符
  • 包含一个大写字母
  • 至少使用一个小写字母
  • 至少由一位数字组成
  • 需要有一个特殊符号(即@、#、$、%等)
  • 不包含空格、制表符等。

1.基于正则表达式的密码验证
正则表达式(或 regex)是 Java 中的有用工具,允许根据特定模式搜索、匹配和转换字符串。在相同的上下文中,正则表达式采用更静态的密码验证方法,该方法在预定义的正则表达式的帮助下进行操作。

下面的Java正则表达式封装了指定的需求:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@#$%^&+=]).{8,}$
分解它的组成部分:

  • ^:表示字符串的开头
  • (?=.*[az]):确保至少有一个小写字母
  • (?=.*[AZ]):需要至少一个大写字母
  • (?=.*\\d):需要至少一位数字
  • (?=.*[@#$%^&+=]):提供至少一个特殊符号的保证
  • .{8,20}:规定最小长度为 8 个字符,最大长度为 20 个字符
  • $:终止字符串

让我们使用正则表达式进行密码验证:

@Test
public void givenStringPassword_whenUsingRegulaExpressions_thenCheckIfPasswordValid() {
    String regExpn = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,20}$";
    Pattern pattern = Pattern.compile(regExpn, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(password);
    assertTrue(matcher.matches());
}

在这里,我们描述了regExpn正则表达式,它指定了密码的某些规则。此外,我们使用Pattern.compile()方法将regExpn正则表达式编译为模式,然后通过pattern.matcher()方法为给定密码创建匹配器。

最后,我们利用matcher.matches()方法来确定密码是否满足regExpn正则表达式。

2.动态密码验证
该方法提供了一种动态密码验证方法,可以基于不同的属性创建模式。该技术涉及任意模式,包括最小/最大长度、特殊符号和其他元素。

让我们实现这个方法:

@Test
public void givenStringPassword_whenUsingDynamicPasswordValidationRules_thenCheckIfPasswordValid() {
    boolean result = false;
    try {
        if (password != null) {
            String MIN_LENGTH = "8";
            String MAX_LENGTH =
"20";
            boolean SPECIAL_CHAR_NEEDED = false;
            String ONE_DIGIT =
"(?=.*[0-9])";
            String LOWER_CASE =
"(?=.*[a-z])";
            String UPPER_CASE =
"(?=.*[A-Z])";
            String SPECIAL_CHAR = SPECIAL_CHAR_NEEDED ?
"(?=.*[@#$%^&+=])" : "";
            String NO_SPACE =
"(?=\\S+$)";
            String MIN_MAX_CHAR =
".{" + MIN_LENGTH + "," + MAX_LENGTH + "}";
            String PATTERN = ONE_DIGIT + LOWER_CASE + UPPER_CASE + SPECIAL_CHAR + NO_SPACE + MIN_MAX_CHAR;
            assertTrue(password.matches(PATTERN));
        }
    } catch (Exception ex) {
        ex.printStackTrace();
        fail(
"Exception occurred: " + ex.getMessage());
    }
}

在这里,我们首先确保密码不等于空,然后再进行验证。然后,该方法通过各个字符串确定验证标准,规定诸如是否存在一位数字、一个小写符号和带有可选特殊字符的大写字母等问题。

此外,我们使用MIN_MAX_CHAR字符串来建立密码的最小和最大长度限制,使用定义的标准MIN_LENGTH和MAX_LENGTH。然后,复合PATTERN字符串连接所有指示的先决条件以开发动态验证模式。

最后,我们利用assertTrue(password.matches(PATTERN))方法来验证密码是否符合动态创建的模式。如果验证过程中出现异常,则认为测试失败;打印异常的详细信息以用于调试目的。

这种方法提供了通过更改参数来设置密码验证规则的灵活性,这使得它适用于不同的验证器。