我正在尝试使用以下条件为密码编写javascript验证:
密码必须:
EG: “helloo15”,“1helloo5”和“h1111111”有效,“helloo1500”,“27272727”和“helloos5”无效。
这就是我目前所拥有的:
//Password
var pw = document.myForm.password1.value;
var Vpw = /^[a-zA-Z0-9]{8}$/;
if (!Vpw.test(pw)) {
alert("Password must be 8 digits long. It must include a maximum of two numbers.");
return false;
} else {
/* alert("Valid CCV!"); */
}
但我无法弄清楚如何将它限制在字符串中的任何位置至少2个数字。谢谢!
答案 0 :(得分:1)
尝试这个
var pass = "some44Passddword"; //document.myForm.password1.value;
var patt = new RegExp("^(?=(.*[a-zA-Z]){1,})(?=(.*[0-9]){2,}).{8}$");
if ( !patt.test(pass) )
{
alert("Password must be 8 digits long. It must include a maximum of two numbers.");
//return false;
}
else
{
alert("Valid!");
}
您可以在此处查看:https://jsfiddle.net/esj9go59/
更新
还可以避免像“$%#^&”这样的非单词字符你应该使用
^(?!(.*[^a-zA-Z0-9]){1,})(?=(.*[a-zA-Z]){1,})(?=(.*[0-9]){2,}).{8}$
正则表达式。
请注意,由于某些原因,javascript 测试功能不会将 \ W 视为非单词字符,最好使用[^a-zA-Z0-9]
代替此如下面的评论中所述
答案 1 :(得分:1)
我知道每个人都来过这里并告诉你使用正则表达式(部分是因为你从那开始)。请不要。有时候正则表达式是更好的选择。这种情况很少见,但是它们过度使用,而这不是其中之一。以下代码比接受的答案中的正则表达式混乱更具可读性。
此代码还允许您单独测试每个条件并为用户提供自定义错误。
function isValidPassword(str)
{
return str.length == 8 &&
digitCount(str) >= 2 &&
hasLetters(str) &&
hasOnlyLettersAndDigits(str);
}
function isAsciiCodeLetter(asciiCode)
{
return (65 <= asciiCode && asciiCode <= 90) ||
(97 <= asciiCode && asciiCode <= 122);
}
function isAsciiCodeDigit(asciiCode)
{
return 48 <= asciiCode && asciiCode <= 57;
}
function hasLetters(str)
{
for (var i = 0, len = str.length; i < len; i++)
{
if (isAsciiCodeLetter(str.charCodeAt(i)))
return true;
}
return false;
}
function hasOnlyLettersAndDigits(str)
{
for (var i = 0, len = str.length; i < len; i++)
{
var asciiCode = str.charCodeAt(i);
if (!isAsciiCodeLetter(str.charCodeAt(i)) &&
!isAsciiCodeDigit(str.charCodeAt(i)))
{
return false;
}
}
return true;
}
function digitCount(str)
{
var count = 0;
for (var i = 0, len = str.length; i < len; i++)
{
if (isAsciiCodeDigit(str.charCodeAt(i)))
{
count++;
}
}
return count;
}
不要使用正则表达式,但如果你已经开始使用正则表达式,请在[0-9].*[0-9]
上匹配2位数字,[a-zA-Z]
匹配字符,^[0-9a-zA-Z]{8}$
仅限长度和字符/数字要求。这至少有点可读:
function isValidPassword(str)
{
var atLeastTwoDigits = new RegExp("[0-9].*[0-9]");
var atLeastOneCharacter = new RegExp("[a-zA-Z]");
var onlyEightCharactersAndDigits = new RegExp("^[0-9a-zA-Z]{8}$");
return atLeastTwoDigits.test(str) &&
atLeastOneCharacter.test(str) &&
onlyEightCharactersAndDigits.test(str);
}
测试用例:
alert(isValidPassword("asdfasdf")); //false
alert(isValidPassword("asdfasd4")); //false
alert(isValidPassword("7sdfasd4")); //true
alert(isValidPassword("asdfas`f")); //false
alert(isValidPassword("asd3a4df-")); //false
alert(isValidPassword("asd3a4f-")); //false
alert(isValidPassword("asd3a4df")); //true
alert(isValidPassword("12345678")); //false
alert(isValidPassword("1helloo5")); //true
alert(isValidPassword("helloos5")); //false
alert(isValidPassword("45345345")); //false
alert(isValidPassword("123`567d")); //false
答案 2 :(得分:0)
你可以使用另一个正则表达式:
//This will yield FALSE (as you expect)
var pw = "1jkj3kjlkj3"
alert(pw.replace(/[^0-9]/g,"").length >= 2)
&#13;
您可以创建一个功能或将其添加到if
。