具有特殊字符的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!#$%&? "])[a-zA-Z0-9!#$%&?]8,20$/
我花了一段时间才弄清楚这些限制,但我做到了!
限制:(注:我使用了>>和来显示重要的字符)
-
最少 8 个字符
>>8,20
最多 20 个字符 8,>>20
至少一个大写字符(?=.*[A-Z])
至少一个小写字符(?=.*[a-z])
至少一位数字(?=.*\d)
至少一个特殊字符(?=.*[a-zA-Z >>!#$%&? "<<])[a-zA-Z0-9 >>!#$%&?<< ]
【讨论】:
'@' 和 '^' 符号呢? @prahack/^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[a-zA-Z!#$@^%&? "])[a-zA-Z0-9!#$@^%&?]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]/) < 0) errors.push("Your password must contain at least one lowercase letter.") if (p.search(/[A-Z]/) < 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])
- 断言一个字符串至少有一个数字;
(?=.*[!@#$%^&*])
- 断言一个字符串至少有一个特殊字符。
【讨论】:
可以将正则表达式缩短为/^(?=.*[\d])(?=.*[!@#$%^&*])[\w!@#$%^&*]6,16$/
/^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$% ^&*]6,16$/.test("12345678@12") 将返回 true。如果我想强制包含字母怎么办?
如果我var regexPttn = new RegExp("/^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$%^&*]6,16$/");
出于某种原因使用创建者破坏了它,有谁知道为什么这个正则表达式不起作用。
@Bhuvan 我用这个答案来改进提供的表达式。首先包括更多特殊字符 [空格、连字符、问号、斜杠、反斜杠] 并且 - 最重要的是 - 我增加了最小字符数,因为 6 个字符的密码非常不安全,特别是如果没有侧翼登录失败监控和/或2FA。也就是说,我来到了这个:^(?=.*[0-9])(?=.*[- ?!@#$%^&*\/\\])(?=.*[A-Z])(?=.*[a-z])[a-zA-Z0-9- ?!@#$%^&*\/\\]8,30$
我会将[a-zA-Z0-9!@#$%^&*]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# 中具有流畅验证的正则表达式 - 如何在密码中不允许空格和某些特殊字符?