使用javascript进行密码验证
我需要使用javascript将密码字段与以下要求匹配:使用javascript进行密码验证,javascript,regex,passwords,Javascript,Regex,Passwords,我需要使用javascript将密码字段与以下要求匹配: 应该是至少有一个特殊字符的alpha numaric 不允许有空格 应至少为10个字符,最多为20个字符 字符重复次数不得超过2次 ~,':;^|不允许 我有一个正则表达式 变量密码=/^(?=[0-9])(?=[!@$%^&])[a-zA-Z0-9!$%^&]{10,20}$/; 我怎样才能解决这个问题 这应该有效: /^(?=.*?[!@#$%^&])(?:([a-zA-Z0-9!@#$%^&])(?!.*?\1.*?
变量密码=/^(?=[0-9])(?=[!@$%^&])[a-zA-Z0-9!$%^&]{10,20}$/; 我怎样才能解决这个问题 这应该有效:
/^(?=.*?[!@#$%^&])(?:([a-zA-Z0-9!@#$%^&])(?!.*?\1.*?\1)){10,20}$/
(如果重复2次以上,则表示同一字符不能出现三次)
说明:第一个条件:在开始时,我们将第一次遍历整个字符串,直到找到一个特殊字符,一旦找到它,我们就停止,如果没有,它将失败():
(?=.*?[!@$%^&])
第二个条件:无事可做,
[a-zA-Z0-9!@$%^&]
无论如何都不允许使用空格第三个条件:量词:
{10,20}
第四个条件:微妙的一个条件:当我们完成字符串时,对于捕获的每个字符,我们都会检查它没有重复两次(相同的源代码):
(?!*\1.*\1)
第5个条件:与空白相同,这可能是必需的正则表达式
^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[A-Za-z\d!@#$%^&|]{10,20}$
(?=.[!@$%^&])
确保列出的字符至少出现一次
(?!.*().*\1.*\1)
确保字符重复不超过两次
[A-Za-z\d!@$%^&|]{10,20}
匹配字符类中出现的10-20个字符。我将编写单独的规则(可能对所有规则使用正则表达式-为了一致性-除非性能非常重要),每个规则都与列表中的规则直接相关
代码
虽然可以使正则表达式更简洁,但我认为使规则更符合您的意图更易于维护。如果性能是一个重要的问题(通常不适用于此类问题),那么我将避免使用正则表达式,并使用字符串方法实现规则
正则表达式解释
p.s.你应该在你使用的正则表达式中保留大量注释,因为与书籍不同,它们写起来比读起来容易得多基于你需求中的5件事这正是你需要的模式
^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[^\s~,'.:;^|]{10,20}$
var password=/^(?=.[0-9])(?=.[!@$%^&*])[a-zA-Z0-9!@$%^&*]{10,20}$/;我不会对用户施加这样的passwort约束。下面是对密码优势的一个非常全面的分析:@SachinMalmanchi请检查我的正则表达式是否为您工作。您能对此给出解释吗?@Loamhoof我的正则表达式在哪里失败?请给出答案example@SachinMalmanchi当然,这不是因为*不在你“给予”的特殊字符列表中@Loamhoof哪里会失败?请举个例子,我在发布评论后立即删除了我的评论,因为它是错误的,对不起。尽管你仍然应该更改
(?=.[!@$%^&])
,因为它的性能非常差,最后一个。*是不必要的。尽管如此,我想对于这么小的字符串来说,这并不重要。@Loamhoof如果性能是一个问题,那么应该完全避免使用正则表达式。[^\s]
可以替换为\s
@NaveedS updated-谢谢。还有什么改进吗?我确实喜欢一个好的正则表达式@比利·穆恩:我们怎么能用正则表达式来写呢??请回复me@SachinMalmanchi我的解决方案为您定义的每个规则使用正则表达式。然后,您需要根据每个规则检查密码。我的演示代码向您展示了javascript控制台中有效密码的输出形式。如果您将输入更改为无效密码,一个或多个规则将失败,在我的演示代码中显示false
。您应该编写一个包装函数,包括我的演示代码,它接受密码,并为有效密码返回true,或者在密码无效时处理错误。如果密码无效,您应该通知用户违反了哪条规则。您能给出一个满足您的条件并且在这个网站上的patterntest中失败的例子吗
/ // start regex pattern
[ // open character class
@+#$ // match one of these `special` characters
] // close character class
/ // end regex pattern
/ // start regex pattern
^ // start matched string
\S+ // one or more (`+`) not spaces (`\S`)
$ // end matched string
/ // end regex pattern
/ // start regex pattern
^ // start matched string
.{10,20} // between 10 and 20 of any character (`.`)
$ // end matched string
/ // end regex pattern
/ // start regex pattern
(.) // any character captured as group 1
(.*\1){2} // followed by zero or more of anything (`\.*`) and then the captured group 1 (`\1`) two times (`{2}`)
/ // end regex pattern
/ // start regex pattern
^ // start matched string
[ // open character class
^~,'.:;^| // not (`^`) one of these characters
]+ // close character class
$ // end matched string
/ // end regex pattern
^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[^\s~,'.:;^|]{10,20}$