Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML5模式正则表达式密码匹配_Javascript_Regex - Fatal编程技术网

Javascript HTML5模式正则表达式密码匹配

Javascript HTML5模式正则表达式密码匹配,javascript,regex,Javascript,Regex,正在查找有关使用以下规则验证密码的帮助: 8个以上字符 包含至少1个大写字母 包含至少1个小写字母 包含至少1个数字 不能以数字开头 不包含特殊字符 我已经做到了: (?=.*\d.*)(?=.[a-z].*)(?=.[a-z].*)(?=.[!\$%&\?])。{8,} 但似乎不知道如何使第一个数字与某个数字不匹配,并将特殊字符类设置为不匹配。非常感谢您的帮助。以下是我的建议: (?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*[!#\$%&\?])^\D.{7}

正在查找有关使用以下规则验证密码的帮助:

8个以上字符

包含至少1个大写字母

包含至少1个小写字母

包含至少1个数字

不能以数字开头

不包含特殊字符

我已经做到了:

(?=.*\d.*)(?=.[a-z].*)(?=.[a-z].*)(?=.[!\$%&\?])。{8,}


但似乎不知道如何使第一个数字与某个数字不匹配,并将特殊字符类设置为不匹配。非常感谢您的帮助。

以下是我的建议:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*[!#\$%&\?])^\D.{7}
请注意,每个前瞻项之后的
*
是多余的

(?!…)
是一种消极的前瞻,以确保没有特殊字符

^\D
要求第一个字符为非数字。然后我只需要7个字符,因为结尾不是强制的

但是为什么要从密码中排除特殊字符呢?通常情况下,恰恰相反的做法是被鼓励的。

那么:

pwd.length >= 8 &&
pwd.match(/[A-Z]/) &&
pwd.match(/[a-z]/) &&
pwd.match(/\d/) &&
!pwd.match(/^\d/) &&
!pwd.match(/[!#\$%&\?]/);

以防您需要维护此代码?

我发现将其分解为单独的测试是:

  • 易于编码
  • 易读
  • 易于维护
  • 并且在需求变化时更加灵活
试着这样做:

var testPassword = function (password) {
    var minLengthMet = password.length >= 8,
        hasUpper = (/[A-Z]+/).test(password),
        hasLower = (/[a-z]+/).test(password),
        hasNumber = (/[0-9]+/).test(password),
        letterBegin = (/^[A-Za-z]/).test(password),
        noSpecials = !(/[^A-Za-z0-9]+/).test(password);
    return minLengthMet && hasUpper && hasLower && hasNumber && letterBegin && noSpecials;
};

请在此处查看操作:

只是一句话,为了更好地保护密码安全,允许使用一些特殊字符可能是一件好事,但为了尽可能地扩大可能性,ERP系统不允许使用特殊字符。好主意!只需注意:
[A-Za-z]
\w
相同,
[0-9]
\d
相同,
[^A-Za-z0-9]
可以是
[^\w\d]
@JanTuroň,这不是100%正确的Jan.\w还包括下划线\w将与[A-Za-z0-9_]@JanTuroň相同:它们不一样<代码>\w与
[A-Za-z0-9\]
相同。关于
\d
,您是正确的。就我个人而言,我更喜欢字符类而不是速记,因为我觉得它们更容易阅读。虽然我很欣赏对复杂正则表达式的掌握,但如果我在我正在编写的代码中发现类似的东西,我会找到作者,并给他们发一封措辞强硬的投诉信。@MatthewGilliard,我的观点是正确的。通常最好将其分为多个步骤。但是,如果代码库使用了大量正则表达式,并且每个人都熟悉它们(并且有很好的文档记录,并附有注释),我认为这一点并没有那么复杂。维护起来很难,运行起来也很费时。regex解决方案非常简单,如果人们不理解regex,那么他们仍然无法获得传递给match方法的值。我知道好的干净的代码很重要,但对于不懂语法的人来说,简化语法似乎有些过头了。比如用英语写一本书,这样法国人就可以读了。