Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于验证密码的正则表达式,该密码只接受固定长度之间的密码_Java_Regex_Passwords - Fatal编程技术网

Java 用于验证密码的正则表达式,该密码只接受固定长度之间的密码

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之间的密码

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

我的正则表达式是:

^(?=.{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])
    -至少一位数字
  • (?=.[a-z])
    -至少一个小写ASCII字母
  • (?=.*[A-Z])
    -至少一个uppecase ASCII字母
  • (?=.[!@$%^&+=])
    -集合中定义的至少一个特殊字符
  • {10,16}
    -任何10到16个字符
  • $
    -字符串结束
在Java中,如果在
.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;
}