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

2022-08-31 09:07:20

我正在为密码验证创建一个正则表达式,以便在Java应用程序中用作配置参数。

正则表达式为:

^.*(?=.{8,})(?=..*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$

密码策略为:

  • 至少 8 个字符

  • 至少包含一位数字

  • 至少包含一个下部 α 字符和一个上部 α 字符

  • 在一组特殊字符(等)中至少包含一个字符@#%$^

  • 不包含空格、制表符等。

我只缺少第5点。我无法让正则表达式检查空格、制表符、回车符等。

任何人都可以帮我吗?


答案 1

试试这个:

^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}$

解释:

^                 # start-of-string
(?=.*[0-9])       # a digit must occur at least once
(?=.*[a-z])       # a lower case letter must occur at least once
(?=.*[A-Z])       # an upper case letter must occur at least once
(?=.*[@#$%^&+=])  # a special character must occur at least once
(?=\S+$)          # no whitespace allowed in the entire string
.{8,}             # anything, at least eight places though
$                 # end-of-string

添加、修改或删除单个规则很容易,因为每个规则都是一个独立的“模块”。

构造会吃掉整个字符串 (),并回溯到可以匹配的第一个匹配项。如果找到,它将成功,否则它将失败。(?=.*[xyz]).*[xyz][xyz]

另一种方法是使用不情愿的限定符:。对于密码检查,这几乎没有任何区别,对于更长的字符串,它可能是更有效的变体。(?=.*?[xyz])

当然,最有效的变体(但最难阅读和维护,因此最容易出错)是。对于这种长度的正则表达式和目的,我不建议这样做,因为它没有真正的好处。(?=[^xyz]*[xyz])


答案 2

使用正则表达式的简单示例

public class passwordvalidation {
    public static void main(String[] args) {
      String passwd = "aaZZa44@"; 
      String pattern = "(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}";
      System.out.println(passwd.matches(pattern));
   }
}

解释:

  • (?=.*[0-9])一个数字必须至少出现一次
  • (?=.*[a-z])小写字母必须至少出现一次
  • (?=.*[A-Z])大写字母必须至少出现一次
  • (?=.*[@#$%^&+=])特殊字符必须至少出现一次
  • (?=\\S+$)整个字符串中不允许使用空格
  • .{8,}至少 8 个字符