我有正则表达式验证密码,只接受10到16之间的密码。
但是,即使我输入超过16个字符,它也会返回 true 。
我的正则表达式是:
^(?=.{10,16})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).*$
答案 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):
$
<强>详情
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).{10,16}$
^^^^ ^^^^^^^^
- 字符串开头^
- 至少一位数(?=.*[0-9])
- 至少一个小写ASCII字母(?=.*[a-z])
- 至少一个uppecase ASCII字母(?=.*[A-Z])
- 至少有一个在集合(?=.*[!@#$%^&+=])
- 任何10到16个字符.{10,16}
- 字符串结束。在Java中,如果您使用$
方法中的模式,则不需要前导^
和尾随$
,因为它需要完整的字符串匹配。
爪哇:
.matches()