如何使用正则表达式验证密码?

Posted

技术标签:

【中文标题】如何使用正则表达式验证密码?【英文标题】:How do I validate a password using regular expressions? 【发布时间】:2020-11-16 23:37:45 【问题描述】:

有人可以帮助使用以下 javascript。我是编码新手,目前正在使用正则表达式练习密码验证。以下验证不起作用,我不明白为什么,因为我之前在不使用 re 的情况下练习了 pw 验证并且效果很好。

例如: - 如果密码不匹配,则不显示错误消息,表格被接受。 - 如果用户名只包含字母,该表单仍然被接受。

任何帮助/提示都会很棒! (p.s.这个js格式是一个在线导师使用的……不知道为什么它不适合我……但我也有点困惑他为什么按这个顺序写js!)

<!DOCTYPE html>

<html>
<head>
    <meta charset="utf-8">
    <!--<link rel="stylesheet" type="text/css" href="stylesheet.css" > -->
    <link type="text/css" rel="stylesheet" href="stylesheet.css">  
    </head>

<body>
    <h1>Using regular expressions</h1>
    
    <form onsubmit="return checkForm(this);">
        <p> Username: <input type="text" name="username"/></p>
        <p> Password: <input type="password" name="pwd1"/></p>
        <p> Confirm Password: <input type="password" name="pwd2"/></p>
        <p> <input type="submit"/></p>
    
    </form>
    
    <script>
    
    function checkPassword(str) 
            var re = /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).8$/;
            return re.test(str);
    
        
    function checkForm(form) 
        if (form.username.value == "") 
            alert("Username cannot be blank!");
            form.username.focus();
            return false;        
        
        re = /^\w+$/;
        if (!re.test(form.username.value)) 
            alert("Username must contain letters, numbers and underscores only");
            form.username.focus();
            return false;
        
        if (form.pwd1.value != "" && form.pwd1.value == form.pwd2.value) 
            if(!checkPassword(form.pwd1.value))
               alert("Incorrect");
                form.pwd1.focus();
                return false;
            
           alert("You have successfully registered!");
            return true;
            
            
    
    </script>
    
    
    </body>
    
    
    
</html>

【问题讨论】:

请用“不工作”定义你的意思。控制台中是否有任何错误?添加测试用例,说明您认为存在问题的原因。 请举一些它不起作用的例子 【参考方案1】:

要检查包含至少一个数字和一个特殊字符的 7 到 15 个字符的密码

function CheckPassword(inputtxt) 
    var paswd = /^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$%^&*]7,15$/;
    if (inputtxt.value.match(paswd)) 
        alert('Correct, try another...')
        return true;
     else 
        alert('Wrong...!')
        return false;
    

检查8到15个字符的密码,其中至少包含一个小写字母、一个大写字母、一个数字和一个特殊字符

function CheckPassword(inputtxt) 
    var decimal = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?!.*\s).8,15$/;
    if (inputtxt.value.match(decimal)) 
        alert('Correct, try another...')
        return true;
     else 
        alert('Wrong...!')
        return false;
    

【讨论】:

“我是编码新手,目前正在练习使用正则表达式进行密码验证” - 如何解释问题而不是仅仅向 OP 扔一堆代码。 【参考方案2】:

由于这一行,您的代码允许使用无效密码:

if (form.pwd1.value != "" && form.pwd1.value == form.pwd2.value) 
  if (!checkPassword(form.pwd1.value)) 
    alert("Incorrect");

基本上是在说:

如果密码 1 不为空且两个密码相同,请验证密码。

这没有意义。为什么只在密码不为空或两者相同时才验证密码?这允许一个人输入无效密码并逃脱它,只要他们在 2 个密码框中输入不同的值,或者即使他们根本没有输入密码。

把上面的代码改成这样:

  if (form.pwd1.value != form.pwd2.value || !checkPassword(form.pwd1.value || '')) 
    alert("Incorrect");

如果用户尝试输入空白密码、两个密码不相等或其中一个密码未通过验证测试,则会显示错误消息。

【讨论】:

非常感谢您的帮助,我认为 if (form.pwd1.value != "" && form.pwd1.value == form.pwd2.value) 是说如果 pwd 1 是非空白且 pwd1 和 2 相同,然后运行 ​​checkPassword,如果不正确,则发出警报(“不正确”)。应该改为 if (form.pwd1.value != "" && form.pwd1.value == form.pwd2.value && !checkPassword(form.pwd1.value)) 还是没有意义?在你给的零钱里,我没用过| |之前,如果你有时间,为什么这比 && 更好?再次感谢您的帮助!

以上是关于如何使用正则表达式验证密码?的主要内容,如果未能解决你的问题,请参考以下文章

用于密码验证的正则表达式

如何对安全密码执行验证。 char[] 上的正则表达式?

如何使正则表达式正确验证信息?

如何在 Python 中测试正则表达式密码?

如何实现密码正则表达式?

js验证密码的正则表达式