Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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
使用javascript进行密码验证_Javascript_Regex_Passwords - Fatal编程技术网

使用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.*?

我需要使用javascript将密码字段与以下要求匹配:

  • 应该是至少有一个特殊字符的alpha numaric
  • 不允许有空格
  • 应至少为10个字符,最多为20个字符
  • 字符重复次数不得超过2次
  • ~,':;^|不允许
  • 我有一个正则表达式
    变量密码=/^(?=[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}$