正则表达式验证只接受固定长度的密码

时间:2017-08-30 06:07:41

标签: java regex passwords

我有正则表达式验证密码,只接受10到16之间的密码。

但是,即使我输入超过16个字符,它也会返回 true

我的正则表达式是:

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

3 个答案:

答案 0 :(得分:1)

你可以简单地使用正则表达式

^[!@#$%^&+=0-9a-zA-Z]{10,16}$

请参阅regex 101 demo

如果您希望密码至少包含[0-9],[a-z],[A-Z],[!@#$%^& + =],则可以将正则表达式更改为

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

答案 1 :(得分:1)

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

您的RegEx问题是.*$。您正在匹配0和无限次之间的字符。 除此之外,一切看起来都很完美。我修改了正向前瞻的顺序,因为如果你在最后放置长度限制,顺序看起来很好。

答案 2 :(得分:1)

使用let attributes: [String : Any] = [NSFontAttributeName: UIFont.systemFont(ofSize: UIFont.systemFontSize, weight: UIFontWeightThin), NSForegroundColorAttributeName: UIColor.blue] let attributedText = NSAttributedString(string: "Some string", attributes: attributes) 预测,您设置最小长度(?=.{10,16})10并不重要,因为您最后没有添加,16告诉停止匹配16个字符匹配后。

您可以在$之后添加$,也可以删除前瞻,并在最终{10,16}之前添加{10,16}

我建议遵循规则的那个:前瞻的数量必须是条件数减1(参见rexegg.com for reference):

$

See the regex demo

<强>详情

  • ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).{10,16}$ ^^^^ ^^^^^^^^ - 字符串开头
  • ^ - 至少一位数
  • (?=.*[0-9]) - 至少一个小写ASCII字母
  • (?=.*[a-z]) - 至少一个uppecase ASCII字母
  • (?=.*[A-Z]) - 至少有一个在集合
  • 中定义的特殊字符
  • (?=.*[!@#$%^&+=]) - 任何10到16个字符
  • .{10,16} - 字符串结束。

在Java中,如果您使用$方法中的模式,则不需要前导^和尾随$,因为它需要完整的字符串匹配。

爪哇:

.matches()