【问题标题】:How to validate password using following conditions?如何使用以下条件验证密码?
【发布时间】:2014-10-12 07:26:21
【问题描述】:

密码应该包含

  1. 至少一个大写字母
  2. 至少一个小写字母
  3. 至少一位数
  4. 至少一个特殊符号
  5. 应该超过 4 个字符

我试过了——^(?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9!@#$%&*]{6,20}$

【问题讨论】:

  • 我尝试了不同的正则表达式,但无法获得完全检查上述条件的表达式
  • 您可以粘贴这些以便我们提供帮助吗?
  • @John 发布该正则表达式...
  • ^(?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9!@#$%&*]{6,20 }$

标签: javascript


【解决方案1】:

您不需要一些大怪物的单个正则表达式,这可能会涉及诸如前瞻之类的奥秘,并且随着新条件的添加而难以维护。你只需要

function validatePassword(pw) {

    return /[A-Z]/       .test(pw) &&
           /[a-z]/       .test(pw) &&
           /[0-9]/       .test(pw) &&
           /[^A-Za-z0-9]/.test(pw) &&
           pw.length > 4;

}

【讨论】:

  • “你不需要正则表达式”,但你发布了一个正则表达式,还有几个;)
  • function validatePassword(email) { var re =/A-Z/.test(pw) && /a-z/.test(pw) && /0-9/.test(pw) && /[^A -Za-z0-9]/.test(pw) && pw.length >=4;返回重新测试(电子邮件); }
  • 您正在创建一个正则表达式并将其设置为一个布尔值以给出密码验证的结果,然后尝试使用该正则表达式来测试电子邮件,所以它不起作用也就不足为奇了。跨度>
  • +1 对于这样一个简单、易读、显而易见、易于维护的解决方案,即使对于正则表达式初学者也是如此。
【解决方案2】:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(\W|_)).{5,}$

您可以将上述正则表达式与前瞻一起使用,如果需要,您可以轻松附加任何其他条件 未来。您基本上是在通过前瞻检查您的每个条件是否存在。

if(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(\W|_)).{5,}$/.test(pwd)){
   // valid password
}

DEMO

【讨论】:

  • 我一直不明白谁认为这实际上是可读的代码。
  • @jfriend00 这可能是不可读的,但它是正则表达式,所以它并不意味着可读,它是功能性的,它是高效的,并且它工作。它有什么问题?
  • 是的,没错。可读的代码非常重要。这么长时间,复杂的正则表达式通常不能满足这个要求,因此我不考虑好的解决方案或好的代码。好的代码应该是正确的、可靠的、易于理解和可维护的(由其他人),并且大致按该顺序具有适当的性能。一个非常复杂的正则表达式至少不能满足其中一个要求。将此的可读性与 torazaburo 的答案进行比较,没有任何争议。
  • @AmitJoki 我最近遇到的一组特别愚蠢的密码规则是“不能连续包含相同的字符”。那怎么做?使用简单的正则表达式,这只是另一个测试,!/(.)\1/.test(pw)。同一组密码规则说“不得包含用户名的前三个或后两个字符”。我该怎么做?归根结底,除了展示精湛技艺之外,单片正则表达式还有什么意义?
  • @AmitJoki 不,实际上我认为您的回答很有趣且很有创意,而且我认为每个人都应该知道如何使用前瞻。
【解决方案3】:

您可以检查没有正则表达式的每个条件。想法是检查每个条件(小写、大写、长度、数字)并更改开关

Demo

HTML

<label for="password">Type password</label><br/>
<input type="text" name="password" id="password" />
<input type="button" name="check" id="check" onclick="check()" value="Check password!"/>

<p id="respuesta"></p>

Javascript

checkbt = document.getElementById("check");
passtxt = document.getElementById("password");
respuesta = document.getElementById("respuesta");

check = function(){
    texto = passtxt.value.trim();
    uppercase = false;
    lowercase = false;
    number = false;
    lenght = false;
    //uppercase letter    
    for (i=0; i< texto.length; i++){
        if (texto[i] == texto[i].toUpperCase()){
            uppercase = true;
            break;
        } else {
            uppercase = false;
        }
    }
//lowercase
        for (i=0; i< texto.length; i++){
            if (texto[i] == texto[i].toLowerCase()){
                lowercase = true;
                break;
            } else {
                lowercase = false;
            }
        }

    //number
        for (i=0; i< texto.length; i++){
            if (!isNaN(texto[i])){
                number = true;
                break;
            } else {
                number = false;
            }
        }    


    if (texto.length < 6){
        lenght = false;
    } else {
        lenght = true;
    }

    if (lowercase && uppercase && number && lenght){
        respuesta.innerHTML = "Password is good";    
    } else {
        respuesta.innerHTML = "Password is bad <br />" +
        "lowercase: " + boolstr(lowercase) + "<br />"+
        "uppercase: " + boolstr(uppercase) + "<br />"+
        "number: " + boolstr(number) + "<br />"+
        "lenght: " + boolstr(lenght) + "<br />";
    }

}

function boolstr(val){
if (val == true)
    return "true";
    else
    return "false";
}

【讨论】:

    【解决方案4】:

    下面的正则表达式应该适合你...

    var pattern = /^(?=.{5,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\W])/
    

    HTML 代码

    <input type="text" id="pass" />
    <input type="button" id="btnpass" value="Test" />
    

    jQuery 代码

    var pattern = /^(?=.{5,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\W])/
    
    $("#btnpass").click(function(){
        var checkval = pattern.test($("#pass").val());
    
        if(!checkval) {
            alert("Invalid password");
        }
    });
    

    http://jsfiddle.net/ty72wn1g/4/

    【讨论】:

    • 这似乎根本不起作用。例如,A1# 验证。整个正则表达式只是向前看。
    • 感谢您测试我的正则表达式。上面的正则表达式现在可以工作了。
    【解决方案5】:

    @user663031 给出的好答案的增强版

    var errors = {
       uppercase: { regex: /[A-Z]/, description: 'At least one uppercase letter' },
       lowercase: { regex: /[a-z]/, description: 'At least one lowercase letter' },
       digit: { regex: /[0-9]/, description: 'At least one digit' },
       special: { regex: /[^A-Za-z0-9]/, description: 'At least one special symbol' },
       length: { test: e => e.length > 2, description: 'Should be more than 2 characters' },
    };
    
    function validatePassword(e) {
      return Object.entries(errors).flatMap(([name, { test, regex, description }]) => {
        const isValid = test ? test(e) : regex.test(e);
        return isValid ? [] : { description, name };
      });
    }
    
    console.log(JSON.stringify(validatePassword('a'),null,2))

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多