【问题标题】:Javascript regular expression password validation having special characters具有特殊字符的Javascript正则表达式密码验证
【发布时间】:2012-08-18 21:03:21
【问题描述】:

我正在尝试使用正则表达式验证密码。如果我们将所有字符都作为字母,密码就会更新。我哪里错了?正则表达式对吗?

function validatePassword() {
    var newPassword = document.getElementById('changePasswordForm').newPassword.value;
    var minNumberofChars = 6;
    var maxNumberofChars = 16;
    var regularExpression  = /^[a-zA-Z0-9!@#$%^&*]{6,16}$/;
    alert(newPassword); 
    if(newPassword.length < minNumberofChars || newPassword.length > maxNumberofChars){
        return false;
    }
    if(!regularExpression.test(newPassword)) {
        alert("password should contain atleast one number and one special character");
        return false;
    }
}

【问题讨论】:

  • 没有得到评估是什么意思?
  • 如果新密码至少包含一个数字和一个特殊字符。即使没有这些条件,密码也会更新。我想我的正则表达式有问题。
  • 你为什么要设置这样一个任意的最大长度?

标签: javascript regex passwords


【解决方案1】:

我的验证 shema - 大写、小写、数字和特殊字符

new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9_])")

【讨论】:

    【解决方案2】:

    我在这里扩展@João Silva 的答案。我需要检查不同的参数并相应地抛出不同的消息。

    我将正则表达式分成不同的部分,现在checkPasswordValidity(String) 函数有条件地检查每个正则表达式部分并抛出不同的消息。

    希望下面的例子能帮助你更好地理解!

    /**
     * @param {string} value: passwordValue
     */
    const checkPasswordValidity = (value) => {
      const isNonWhiteSpace = /^\S*$/;
      if (!isNonWhiteSpace.test(value)) {
        return "Password must not contain Whitespaces.";
      }
    
      const isContainsUppercase = /^(?=.*[A-Z]).*$/;
      if (!isContainsUppercase.test(value)) {
        return "Password must have at least one Uppercase Character.";
      }
    
      const isContainsLowercase = /^(?=.*[a-z]).*$/;
      if (!isContainsLowercase.test(value)) {
        return "Password must have at least one Lowercase Character.";
      }
    
      const isContainsNumber = /^(?=.*[0-9]).*$/;
      if (!isContainsNumber.test(value)) {
        return "Password must contain at least one Digit.";
      }
    
      const isContainsSymbol =
        /^(?=.*[~`!@#$%^&*()--+={}\[\]|\\:;"'<>,.?/_₹]).*$/;
      if (!isContainsSymbol.test(value)) {
        return "Password must contain at least one Special Symbol.";
      }
    
      const isValidLength = /^.{10,16}$/;
      if (!isValidLength.test(value)) {
        return "Password must be 10-16 Characters Long.";
      }
    
      return null;
    }
    
    //------------------
    // Usage/Example:
    let yourPassword = "yourPassword123";
    const message = checkPasswordValidity(yourPassword);
    
    if (!message) {
      console.log("Hurray! Your Password is Valid and Strong.");
    } else {
      console.log(message);
    }

    此外,我们可以将所有这些正则表达式模式组合成一个正则表达式:

    let regularExpression = /^(\S)(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[~`!@#$%^&*()--+={}\[\]|\\:;"'<>,.?/_₹])[a-zA-Z0-9~`!@#$%^&*()--+={}\[\]|\\:;"'<>,.?/_₹]{10,16}$/;
    

    注意:上面讨论的正则表达式将检查给定输入值/密码中的以下模式:

    • 不得包含任何空格。
    • 必须至少包含一个大写字母、一个小写字母和一个数字字符。
    • 它必须至少包含一个特殊字符。 [~`!@#$%^&*()--+={}[]|\:;"',.?/_₹]
    • 长度必须介于 10 到 16 个字符之间。

    谢谢!

    【讨论】:

      【解决方案3】:

      非常有帮助。它将帮助最终用户在输入密码时识别缺少/需要的字符。

      这里有一些改进,(在这里你可以添加你需要的特殊字符。)

      function validatePassword(p) {
          //var p = document.getElementById('newPassword').value,
          const errors = [];
          if (p.length < 8) {
              errors.push("Your password must be at least 8 characters");
          }
          if (p.length > 32) {
              errors.push("Your password must be at max 32 characters");
          }
          if (p.search(/[a-z]/) < 0) {
              errors.push("Your password must contain at least one lower case letter."); 
          }
          if (p.search(/[A-Z]/) < 0) {
              errors.push("Your password must contain at least one upper case letter."); 
          }
      
          if (p.search(/[0-9]/) < 0) {
              errors.push("Your password must contain at least one digit.");
          }
         if (p.search(/[!@#\$%\^&\*_]/) < 0) {
              errors.push("Your password must contain at least special char from -[ ! @ # $ % ^ & * _ ]"); 
          }
          if (errors.length > 0) {
              console.log(errors.join("\n"));
              return false;
          }
          return true;
      }
      

      【讨论】:

        【解决方案4】:

        这是密码验证示例,希望你喜欢。

        必须使用大写、小写、特殊字符、数字和限制为 8 的密码验证。

        function validatePassword(){
            
           var InputValue = $("#password").val();
          var regex = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})");
            $("#passwordText").text(`Password value:- ${InputValue}`);
            
            if(!regex.test(InputValue)) {
                 $("#error").text("Invalid Password");
            }
            else{
                  $("#error").text("");
            }
        }
        #password_Validation{
        background-color:aliceblue;
        padding:50px;
        border:1px solid;
        border-radius:5px;
        }
        #passwordText{
          color:green;
        }
        #error{
        color:red;
        }
        #password{
        margin-bottom:5px;
        }
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <div id="password_Validation">
          <h4>Password validation with Uppercase Lowercase special character and number must be required.</h4>
          <div>
            <input type="password" name="password" id="password">
            <button type="button" onClick="validatePassword()">Submit</button>
           <div>
             <br/>
          <span id="passwordText"></span>
          <br/>
            <br/>
          <span id="error"></span>
        <div>

        【讨论】:

        • 它接受空格。
        • @MechaCode 你可以使用这个正则表达式我希望你能达到你的目标。 ^((?!.*[\s])(?=.*[A-Z])(?=.*\d).{8,15})
        【解决方案5】:

        当您重新制作帐户密码时,请确保它是 8-20 个字符,包括数字和特殊字符,如 ##\/* - 然后验证新密码并重新输入完​​全相同的密码,应该可以解决密码验证问题

        【讨论】:

        • 嗨,欢迎来到堆栈溢出。请提供代码示例以便更好地理解
        【解决方案6】:

        它对我来说是完美的,我肯定会为你们工作,检查它简单而准确

        var regix = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=. 
                    {8,})");
        
        if(regix.test(password) == false ) {
             $('.messageBox').html(`<div class="messageStackError">
               password must be a minimum of 8 characters including number, Upper, Lower And 
               one special character
             </div>`);
        }
        else
        {
                $('form').submit();
        }
        

        【讨论】:

        • 工作正常谢谢
        【解决方案7】:

        经过大量研究,我能够想出这个。这有更多的特殊字符

        validatePassword(password) {
                const re = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()+=-\?;,./{}|\":<>\[\]\\\' ~_]).{8,}/
                return re.test(password);
            }
        

        【讨论】:

          【解决方案8】:

          密码正则表达式

          /^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[a-zA-Z!#$%&amp;? "])[a-zA-Z0-9!#$%&amp;?]{8,20}$/

          我花了一段时间才弄清楚这些限制,但我做到了!

          限制:(注:我使用了>>来显示重要的字符)

          1. 最少 8 个字符 {&gt;&gt;8,20}
          2. 最多 20 个字符 {8,&gt;&gt;20}
          3. 至少一个大写字符(?=.*[A-Z])
          4. 至少一个小写字符(?=.*[a-z])
          5. 至少一位数字(?=.*\d)
          6. 至少一个特殊字符(?=.*[a-zA-Z &gt;&gt;!#$%&amp;? "&lt;&lt;])[a-zA-Z0-9 &gt;&gt;!#$%&amp;?&lt;&lt; ]

          【讨论】:

          • '@' 和 '^' 符号呢?
          • @prahack /^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[a-zA-Z!#$@^%&amp;? "])[a-zA-Z0-9!#$@^%&amp;?]{8,20}$/
          【解决方案9】:

          不要尝试一步做太多。将每条规则分开。

          function validatePassword() {
              var p = document.getElementById('newPassword').value,
                  errors = [];
              if (p.length < 8) {
                  errors.push("Your password must be at least 8 characters");
              }
              if (p.search(/[a-z]/i) < 0) {
                  errors.push("Your password must contain at least one letter."); 
              }
              if (p.search(/[0-9]/) < 0) {
                  errors.push("Your password must contain at least one digit.");
              }
              if (errors.length > 0) {
                  alert(errors.join("\n"));
                  return false;
              }
              return true;
          }
          

          【讨论】:

            【解决方案10】:

            我使用以下脚本输入最少 8 个字母的密码,至少包含一个符号、大小写字母和一个数字

            function checkPassword(str)
            {
                var re = /^(?=.*\d)(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z]).{8,}$/;
                return re.test(str);
            }
            

            【讨论】:

            • 漂亮而精确。这样,它就满足了 AWS Cognito 用户池的默认密码策略。
            【解决方案11】:
            function validatePassword() {
                var p = document.getElementById('newPassword').value,
                    errors = [];
                if (p.length < 8) {
                    errors.push("Your password must be at least 8 characters"); 
                }
                if (p.search(/[a-z]/i) < 0) {
                    errors.push("Your password must contain at least one letter.");
                }
                if (p.search(/[0-9]/) < 0) {
                    errors.push("Your password must contain at least one digit."); 
                }
                if (errors.length > 0) {
                    alert(errors.join("\n"));
                    return false;
                }
                return true;
            }
            

            下面的答案存在一定的问题,因为在检查字符和数字时由于缺少 [ ] 而没有检查整个字符串,这是正确的版本

            【讨论】:

            • 如果你想限制大写或小写,请添加这些:if (p.search(/[a-z]/) &lt; 0) { errors.push("Your password must contain at least one lowercase letter.") } if (p.search(/[A-Z]/) &lt; 0) { errors.push("Your password must contain at least one uppercase letter.") }
            • 这是一个更动态的解决方案,但基本上使用相同的概念:jsfiddle.net/omnius/p6uxjntg
            【解决方案12】:

            您可以为 javascript 验证创建自己的正则表达式

                /^            : Start
                (?=.{8,})        : Length
                (?=.*[a-zA-Z])   : Letters
                (?=.*\d)         : Digits
                (?=.*[!#$%&? "]) : Special characters
                $/              : End
            
            
            
                    (/^
                    (?=.*\d)                //should contain at least one digit
                    (?=.*[a-z])             //should contain at least one lower case
                    (?=.*[A-Z])             //should contain at least one upper case
                    [a-zA-Z0-9]{8,}         //should contain at least 8 from the mentioned characters
            
                    $/)
            
            Example:-   /^(?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9]{7,}$/
            

            【讨论】:

            • XYZ@123 失败
            • @SarasArya 在特殊字符中添加@。它将开始工作。这不是火箭科学!
            【解决方案13】:

            使用积极的lookahead 断言:

            var regularExpression = /^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$%^&*]{6,16}$/;
            

            没有它,您当前的正则表达式仅匹配您有 6 到 16 个有效字符,它验证它有 至少一个数字,并且 至少一个特殊字符。这就是上面的前瞻的目的。

            • (?=.*[0-9]) - 断言一个字符串至少有一个数字;
            • (?=.*[!@#$%^&amp;*]) - 断言一个字符串至少有一个特殊字符。

            【讨论】:

            • 可以将正则表达式缩短为/^(?=.*[\d])(?=.*[!@#$%^&amp;*])[\w!@#$%^&amp;*]{6,16}$/
            • /^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$% ^&*]{6,16}$/.test("12345678@12") 将返回 true。如果我想强制包含字母怎么办?
            • 如果我var regexPttn = new RegExp("/^(?=.*[0-9])(?=.*[!@#$%^&amp;*])[a-zA-Z0-9!@#$%^&amp;*]{6,16}$/"); 出于某种原因使用创建者破坏了它,有谁知道为什么这个正则表达式不起作用。
            • @Bhuvan 我用这个答案来改进提供的表达式。首先包括更多特殊字符 [空格、连字符、问号、斜杠、反斜杠] 并且 - 最重要的是 - 我增加了最小字符数,因为 6 个字符的密码非常不安全,特别是如果没有侧翼登录失败监控和/或2FA。也就是说,我来到了这个:^(?=.*[0-9])(?=.*[- ?!@#$%^&amp;*\/\\])(?=.*[A-Z])(?=.*[a-z])[a-zA-Z0-9- ?!@#$%^&amp;*\/\\]{8,30}$
            • 我会将[a-zA-Z0-9!@#$%^&amp;*]{6,16} 更改为.{6,16} 以便您可以输入任何 字符(只要密码包含数字和特殊字符)。我看不出有任何理由仅仅因为密码包含+ 而拒绝密码。
            【解决方案14】:

            如果您单独检查长度,您可以执行以下操作:

            var regularExpression  = /^[a-zA-Z]$/;
            
            if (regularExpression.test(newPassword)) {
                alert("password should contain atleast one number and one special character");
                return false;
            } 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-12-12
              • 2019-12-19
              • 1970-01-01
              • 2011-12-10
              • 2015-01-05
              • 2020-07-18
              • 2013-09-08
              • 2022-10-22
              相关资源
              最近更新 更多