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

Sri*_*har 35 javascript regex passwords

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Joã*_*lva 63

使用正向前瞻断言:

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

没有它,您当前的正则表达式只匹配您有6到16个有效字符,它验证它至少有一个数字,至少是一个特殊字符.这就是上面的预测.

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

  • 可以将正则表达式缩短为"/ ^(?=.*[/ d]"(?=.*[!@ _.$%^&*]] [\ w!@# $%^&*] {6,16 } $ /` (4认同)
  • /^(?=.*[0-9])(?=.*[!@#$%^&amp;*])[a-zA-Z0-9!@#$%^&amp;*]{6,16 }$/.test("12345678@12") 将返回 true。如果我想强制包含字母怎么办? (3认同)
  • @Bhuvan 我用这个答案来改进所提供的表达。首先,包括更多特殊字符 [空格、连字符、问号、斜杠、反斜杠],并且 - 最重要的是 - 我增加了最小字符数,因为 6 个字符的密码非常不安全,特别是如果两侧没有登录失败监控和/或2FA。也就是说,我想到了这个: `^(?=.*[0-9])(?=.*[- ?!@#$%^&amp;*\/\\])(?=.*[AZ ])(?=.*[az])[a-zA-Z0-9- ?!@#$%^&amp;*\/\\]{8,30}$` (3认同)

小智 28

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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您想限制大写或小写,请添加以下内容:`if (p.search(/[az]/) &lt; 0) {errors.push("您的密码必须至少包含一个小写字母。") } if (p. search(/[AZ]/) &lt; 0) {Errors.push("您的密码必须至少包含一个大写字母。") }` (2认同)

Ujj*_*val 18

你可以为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,}$/
Run Code Online (Sandbox Code Playgroud)

  • @SarasArya在特殊字符中添加`@`.它会开始工作.这不是火箭科学! (9认同)
  • 这对于 XYZ@123 失败了 (3认同)

Ruj*_*hah 14

我使用以下脚本作为最小8字母密码,至少包含一个符号,大写和小写字母以及一个数字

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

  • 又好又精确。这样,它就满足 AWS Cognito 用户池的默认密码策略。 (2认同)

Mit*_*shu 11

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

\n

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

\n

希望下面的例子能够帮助您更好的理解!

\n

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

\n

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

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

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

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

谢谢!

\n


Cha*_*ion 10

不要试图一步到位.保持每条规则分开.

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;
}
Run Code Online (Sandbox Code Playgroud)


Val*_*ira 9

密码正则表达式

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

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

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

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


Han*_*son 6

国际UTF-8

\n

这里的解决方案都不允许使用国际字符,即 \xc3\xa9\xc3\x89\xc3\xa1\xc3\x81\xc3\xb6\xc3\x96\xc3\xa6\xc3\x86\xc3\xbe\xc3\x9e \xc3\xb3\xc3\x93\xc3\xba\xc3\x9a,但只关注英文字母。

\n

以下正则表达式使用 unicode UTF-8 来识别大小写,因此允许国际字符:

\n
// Match uppercase, lowercase, digit or #$!%*?& and make sure the length is 8 to 96 in length  \nconst pwdFilter = /^(?=.*\\p{Ll})(?=.*\\p{Lu})(?=.*[\\d|@#$!%*?&])[\\p{L}\\d@#$!%*?&]{8,96}$/gmu\n\nif (!pwdFilter.test(pwd)) {\n    // Show error that password has to be adjusted to match criteria\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这个正则表达式

\n

/^(?=.*\\p{Ll})(?=.*\\p{Lu})(?=.*[\\d|@#$!%*?&])[\\p{L}\\d@#$!%*?&]{8,96}$/gmu

\n

检查密码中是否使用大写、小写、数字或#$!%*?&。它还限制长度最小为 8,最大为 96,\xe2\x80\x8d 表情符号的长度算作超过 1 个字符的长度。\nu最后,告诉它使用 UTF-8。

\n