Javascript 允许密码中包含多个特殊字符

Javascript 允许密码中包含多个特殊字符,javascript,regex,validation,passwords,Javascript,Regex,Validation,Passwords,我有一个正则表达式,它测试以下规则 密码必须至少有一个字符 密码必须至少有一个数字 密码必须至少有一个字母数字字符。(应允许多于一个) 我的尝试是这样的, /^([a-zA-Z+]+[0-9+]+[!@#$%^&*])$/ 除了添加多个字母数字字符外,这在大多数情况下都可以正常工作 测试 测试[qwer1234]结果[无效]结论[通过] 测试[qwer1234$]结果[有效]结论[通过] 测试[qwer1234#$]结果[无效]结论[失败] 最后一次测试应该通过,但失败了。我知道哪

我有一个正则表达式,它测试以下规则

  • 密码必须至少有一个字符
  • 密码必须至少有一个数字
  • 密码必须至少有一个字母数字字符。(应允许多于一个)
  • 我的尝试是这样的,

    /^([a-zA-Z+]+[0-9+]+[!@#$%^&*])$/
    
    除了添加多个字母数字字符外,这在大多数情况下都可以正常工作

    测试

    • 测试[qwer1234]结果[无效]结论[通过]
    • 测试[qwer1234$]结果[有效]结论[通过]
    • 测试[qwer1234#$]结果[无效]结论[失败]
    最后一次测试应该通过,但失败了。我知道哪里出了问题,但无法掌握正则表达式的魔力。我对问题的看法是

    [0-9+] // This + sign shows that you can have more then 1 of that range of numerics
    
    在哪里,

    [!@#$%^&*] // Does not have the + sign
    
    我试过了

    [!@#$%^&*+] // Does not have the + sign
    [!@#$%^&*]+ // Does not have the + sign
    

    两个都不起作用。我遗漏了什么?

    为什么需要将所有内容合并到一个正则表达式中

    function test_password(password) {
        if (password.length < 2) return false;            // Minimum length
        if (!/[0-9]/g.test(password)) return false;       // Needs a number
        if (!/[a-z]/gi.test(password)) return false;      // Needs a letter
        if (!/[^a-z0-9]/gi.test(password)) return false;  // Needs a special char
    
        return true;
    }
    
    功能测试\u密码(密码){
    if(password.length<2)返回false;//最小长度
    如果(!/[0-9]/g.test(password))返回false;//需要一个数字
    if(!/[a-z]/gi.test(password))返回false;//需要一个字母
    if(!/[^a-z0-9]/gi.test(password))返回false;//需要特殊字符
    返回true;
    }
    
    根据您的实际需要,从您混乱的情况描述中,这里有两个正则表达式,希望对您有所帮助。第一个要求密码至少以1个字母字符开头,第二个至少有1个数字字符,最后至少有1个特殊字符

    /^([a-zA-Z]+[0-9]+[!@#$%^&*]+)$/
    

    如果不要求字符按特定顺序排列,可以尝试以下正则表达式:

    /(?=[^a-zA-Z]*[a-zA-Z])(?=[^0-9]*[0-9])(?=[^!@#$%^&*]*[!@#$%^&*])/
    


    这只要求密码中至少有一个字母字符、至少一个数字字符和至少一个特殊字符,并且可以任意顺序出现。

    请尝试以下操作。如果一个字符应该是第一个,数字应该是第二个,数字应该是下一个,那么它就会起作用


    /^[a-zA-Z]+[1-9]+[!@#$%^&*]+$/

    你有什么正当的理由把这些塞进一个正则表达式中吗?我对你的解释感到困惑。密码的各个部分是否必须按照您指定的顺序提供?比如,它必须是(字母字符)(数字)(特殊字符),还是可以是每个字符至少1个的任意组合?我还不明白为什么在
    []
    中有
    +
    …如果必须按顺序排列,那么应该使用:
    /^([a-zA-Z]+[0-9]+[!@$%^&*]+)$/
    。将
    +
    置于
    []
    之外意味着至少匹配集合中的一个字符。因此,您至少可以拥有类似于
    a2&
    的功能。将
    +
    放在
    []
    内意味着匹配
    +
    字符。所以从技术上讲,你可以在你的正则表达式中有密码
    ++*
    ,它就会通过。但我认为不应该……如果您不需要订单,请尝试以下操作:
    /(?=[^a-zA-Z]*[a-zA-Z])(?=[^0-9]*[0-9])(?=[^!@$%^&*]*[!@$%^&]/
    ,这只需要在密码中至少输入一个。