一尘不染

Java用于密码验证的Regexp Java

java

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

regexp是:

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

密码策略为:

  • 至少8个字符
  • 包含至少一位数字
  • 包含至少一个较低的alpha字符和一个较高的alpha字符
  • 在一组特殊字符(@#%$^等)中包含至少一个字符
  • 不包含空格,制表符等。

我只缺少第5点。我无法进行正则表达式检查空间,制表符,回车等。

有人可以帮我吗?


阅读 569

收藏
2020-02-28

共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])。对于这种长度的正则表达式,并为此目的,我不建议这样做,因为它没有实际好处。

2020-02-28