用于密码验证的正则表达式首字母和尾字母不能有符号

时间:2018-08-09 00:13:41

标签: java regex

我需要一个正则表达式来进行密码验证。 验证规则-

  • 密码区分大小写
  • 长度不能超过50个字符
  • 必须至少包含1个数字
  • 必须至少包含1个符号(非字母或数字)字符
  • 第一个字符不能是符号(非字母或数字)
  • 最后一个字符不能是符号(非字母或数字)
  • 不得重复重复任何字符两次以上
  • 必须至少包含1个小写字母
  • 必须至少包含1个大写字母
  • 长度至少为8个字符

到目前为止,我有这个-

 "^(?!.*(.)\\1{2})(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z0-9]). 
        {8,50}$"

不适用于第一个字符和最后一个字符不能为符号。

我尝试过

^[a-zA-Z0-9](?!.*(.)\1{2})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{6,48}[a-zA-Z0-9]$ 

但是它不能正常工作。请帮帮我。

2 个答案:

答案 0 :(得分:0)

我认为您需要更改方法。您只有一个巨大的可扩展正则表达式的解决方案不符合Java。 我建议您考虑建立一个可以接受不同规则并将其组合的库。与您要显示的正则表达式不同,这将更容易测试,对新手来说更容易理解,错误更少,并且易于扩展。

这里讨论过: Password strength checking library 并建议http://mvnrepository.com/artifact/edu.vt.middleware/vt-password

另一个选项在这里:https://github.com/larcki/validly 所以代码看起来像这样:

import static com.validly.FailFastValidator.*;

public class Validator {

    public void validate(String input) throws ValidationErrorException {
        valid(input)
            .mustNotBeNull("It's null")
            .lengthMustBeAtLeast(2, "It's too short")
            .mustStartWith("Hello", "It doesn't start properly")
            .must(s -> myOwnRule(s), "It doesn't match my own rule");
    }
}

祝你好运!

答案 1 :(得分:0)

每个限制都可以成为未来:

^(?=.*\d).{8,50}
  • (无关)密码区分大小写
  • .{8,50}的长度不得超过50个字符,并且长度至少应为8个字符
  • (?=.*\d)必须至少包含1个数字
  • (?=.*(\W|_))必须至少包含1个符号(非字母或数字)字符
  • [^\W_]第一个字符不能是符号(非字母或数字)
  • [^\W_]最后一个字符不能是符号(非字母或数字)
  • (?!.*(.)\1)不得顺序重复任何字符超过2次
  • (?=.*[a-z])必须至少包含1个小写字母
  • (?=.*[A-Z])必须至少包含1个大写字母

将它们放在一起:

^(?!.*(.)\1)(?=.*\d)(?=.*(\W|_))(?=.*[a-z])(?=.*[A-Z])[^\W_].{6,48}[^\W_]$

请参见live demo