66

正規表現を使用してパスワードを検証しようとしています。すべての文字がアルファベットの場合、パスワードは更新されます。どこが間違っていますか?正規表現は正しいですか?

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;
    }
}
4

15 に答える 15

92

肯定的な先読みアサーションを使用します。

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

それがないと、現在の正規表現は 6 ~ 16 の有効な文字があることのみに一致し、少なくとも数字と少なくとも特殊文字があることを検証しません。それが、上記の先読みの目的です。

  • (?=.*[0-9])- 文字列に少なくとも 1 つの数字があることをアサートします。
  • (?=.*[!@#$%^&*])- 文字列に少なくとも 1 つの特殊文字があることをアサートします。
于 2012-08-23T11:11:01.640 に答える
38
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;
}

文字と数字のチェック中に [ ] がないために文字列全体をチェックしていないため、以下の回答には特定の問題があります。これは正しいバージョンです。

于 2013-05-23T07:07:47.070 に答える
35

少なくとも記号、大文字と小文字、数字を含む、最小8文字のパスワードに次のスクリプトを使用します

function checkPassword(str)
{
    var re = /^(?=.*\d)(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z]).{8,}$/;
    return re.test(str);
}
于 2016-12-02T01:59:01.950 に答える
25

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,}$/
于 2015-08-11T05:54:22.283 に答える
18

1 つのステップで多くのことをしようとしないでください。ルールごとに分けてください。

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;
}
于 2012-08-23T11:19:38.873 に答える
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}$/;

注:上記の正規表現は、指定された入力値/パスワードで次のパターンをチェックします。

  • 空白を含めることはできません。
  • 少なくとも 1 つの大文字、1 つの小文字、および 1 つの数字を含める必要があります。
  • 少なくとも 1 つの特殊文字が含まれている必要があります。[~`!@#$%^&*()--+={}[]|\:;"'<>,.?/_₹]
  • 長さは 10 ~ 16 文字にする必要があります。

ありがとう!

于 2021-09-22T18:42:53.140 に答える
2

それは私にとって完璧に機能し、皆さんが簡単かつ正確にチェックアウトできると確信しています

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();
}
于 2021-02-24T14:33:17.017 に答える
1

長さを個別に確認する場合は、次のことができます。

var regularExpression  = /^[a-zA-Z]$/;

if (regularExpression.test(newPassword)) {
    alert("password should contain atleast one number and one special character");
    return false;
} 
于 2012-08-23T11:10:53.810 に答える