Java 用于验证密码的正则表达式,该密码只接受固定长度之间的密码
我有正则表达式来验证密码,它只接受10到16之间的密码 但是,即使输入的字符超过16个,它也会返回true 我的正则表达式是:Java 用于验证密码的正则表达式,该密码只接受固定长度之间的密码,java,regex,passwords,Java,Regex,Passwords,我有正则表达式来验证密码,它只接受10到16之间的密码 但是,即使输入的字符超过16个,它也会返回true 我的正则表达式是: ^(?=.{10,16})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).*$ 您可以简单地使用正则表达式 ^[!@#$%^&+=0-9a-zA-Z]{10,16}$ 看 如果您希望密码至少包含[0-9]、[a-z]、[a-z]、!@#$%^&+=]中的1个,则可以将正则表达式更改为 ^(?=.*
^(?=.{10,16})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).*$
您可以简单地使用正则表达式
^[!@#$%^&+=0-9a-zA-Z]{10,16}$
看
如果您希望密码至少包含[0-9]、[a-z]、[a-z]、!@#$%^&+=]中的1个,则可以将正则表达式更改为
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).{10,16}$
正则表达式的问题是,*$
。您正在匹配0到无限次之间的字符。
除此之外,一切看起来都很完美。我修改了正向lookaheads的顺序,因为如果在末尾设置长度限制,顺序看起来很好。使用(?=.{10,16})
向前看,可以设置最小长度10
,,16
并不重要,因为您没有在末尾添加$
,告诉您在匹配16个字符后停止匹配
您可以在{10,16}
之后添加$
,也可以删除先行项并在最后一个$
之前添加{10,16}
我建议遵循以下规则:lookaheads的数量必须是条件数减1(请参阅):
详细信息
-字符串的开头^
-至少一位数字(?=.[0-9])
-至少一个小写ASCII字母(?=.[a-z])
-至少一个uppecase ASCII字母(?=.*[A-Z])
-集合中定义的至少一个特殊字符(?=.[!@$%^&+=])
-任何10到16个字符{10,16}
-字符串结束$
.matches()
方法中使用模式,则不需要前导的^
和尾随的$
,因为它需要完整的字符串匹配
爪哇:
是的,它会匹配任何给定的字符10到16times@Narendra不,此正则表达式不符合原始要求。您只需将
*$
替换为{10,16}$
。并删除(?=.{10,16})
。否则,在(?=.{10,16})
=>(?=.{10,16}$)
中添加$
,这是一个错误的答案。如果您提供属于该集合的任何一个字符,[!@$%^&+=0-9a-zA-Z]
,则您的密码仍然有效。您希望密码至少包括一个A-Z
,一个A-Z
,一个0-9
,以及属于该集合的一个特殊字符,[!@$%^&+=]
@Srichandradeep和Wiktor让我试试您的建议。@Narendra我发布了答案。^(?=.[0-9])(?=.[A-z])(?=.[A-z])(?=.[!@$%^&+])(?=.{10,16})$
模式是从不匹配任何字符串的正则表达式的另一个示例。对不起。我需要删除^$
字符。复制粘贴错误。顺便说一句,我不知道这在Java中是否能完美工作。这是基于脚本语言语法的。让我解释一下:^(?=a)$
(这基本上就是您以前的正则表达式版本简化为的)模式与任何字符串都不匹配,因为(?=a)
在字符串开头触发一次(就像在^
之后一样)并要求字符串中的第一个字符为a
。由于$
要求在字符串开始后立即结束字符串,因此正则表达式将失败,因为它将无法读取字符串中的第一个字符。为什么选择这样的解决方案?@Wiktor我不知道在哪种情况下它将不起作用。嗯,这个答案在3分钟前已经更改了,如果没有锚,它将无法与matches()
@Wiktor一起工作。无论如何,我使用的是您的正则表达式,它的工作原理您的解释非常清楚,可以通过一个工作解决方案来理解。
(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=])(?=.{10,16})
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).{10,16}$
^^^^ ^^^^^^^^
if (s.matches("(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).{10,16}")) {
return true;
}