具有特殊字符的Javascript正则表达式密码验证

Posted

技术标签:

【中文标题】具有特殊字符的Javascript正则表达式密码验证【英文标题】:Javascript regular expression password validation having special characters 【发布时间】: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;
    

【问题讨论】:

没有得到评估是什么意思? 如果新密码至少包含一个数字和一个特殊字符。即使没有这些条件,密码也会更新。我想我的正则表达式有问题。 你为什么要设置这样一个任意的最大长度? 【参考方案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$/

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

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

    最少 8 个字符 &gt;&gt;8,20 最多 20 个字符 8,&gt;&gt;20 至少一个大写字符(?=.*[A-Z]) 至少一个小写字符(?=.*[a-z]) 至少一位数字(?=.*\d) 至少一个特殊字符(?=.*[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;
 

【讨论】:

以上是关于具有特殊字符的Javascript正则表达式密码验证的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中具有流畅验证的正则表达式 - 如何在密码中不允许空格和某些特殊字符?

带有大写,小写,数字和特殊字符的复杂密码的正则表达式(Python)

Javascript校验密码复杂度的正则表达式

正则表达式验证密码必须由大小写字母、数字、特殊字符组成

2-JavaScript正则表达式

密码的正则表达式 = 一个数字以及大小写字母和特殊字符但是!开头或结尾没有特殊字符