使用Regex Java进行密码验证

时间:2016-03-18 19:55:16

标签: java regex

我正在尝试找出一个匹配包含

的密码的正则表达式
  1. 一个大写字母。
  2. 一个号码
  3. 一个特殊的角色。
  4. 且长度至少为4个字符
  5. 我写的正则表达式是

    ^((?=.*[0-9])(?=.*[A-Z])(?=.*[^A-Za-z0-9])){4,}

    然而它不起作用,我无法弄清楚原因。

    所以请有人告诉我为什么这段代码不起作用,我在哪里搞砸了,以及如何纠正这段代码。

2 个答案:

答案 0 :(得分:1)

您的正则表达式可以重写为

^(
  (?=.*[0-9])
  (?=.*[A-Z])
  (?=.*[^A-Za-z0-9])
 ){4,}

如您所见{4,}适用于不允许您匹配任何字符的群组,因为环视为零宽度,这实际上意味着" 4或更多没有任何"。

您需要在.之前添加{4,}以让您的正则表达式处理"以及至少4个字符的长度"点(休息由环顾处理) 您可以删除该捕获组,因为您并不真正需要它。

所以试试像

这样的东西
^(?=.*[0-9])(?=.*[A-Z])(?=.*[^A-Za-z0-9]).{4,}

答案 1 :(得分:0)

你可以拿出某事。像:

^(?=.*[A-Z])(?=.*\d)(?=.*[!"§$%&/()=?`]).{4,}$

在多线模式下,请参阅a demo on regex101.com 这种方法直接指定了特殊字符(显然可以扩展) 从以下列表中,只有粗体符合以下条件:

  • 测试
  • Test123!
  • StrongPassword34吗
  • weakone
  • Tabaluga“12 ???

您仍然可以通过更具体和需要相反的对来增强此表达式。只是为了提醒你,点星(.*)会让你失望,然后最终回溯。这几乎总是需要更多的步骤,而不是直接寻找相反的对 请考虑以下表达式:

^                    # bind the expression to the beginning of the string
(?=[^A-Z\n\r]*[A-Z]) # look ahead for sth. that is not A-Z, or newline and require one of A-Z
(?=[^\d\n\r]*\d)     # same construct for digits
(?=\w*[^\w\n\r])     # same construct for special chars (\w = _A-Za-z0-9)
.{4,}
$

你会看到a significant reduction in steps因为正则表达式引擎不必每次都回溯。