Javascript HTML5模式正则表达式密码匹配
正在查找有关使用以下规则验证密码的帮助: 8个以上字符 包含至少1个大写字母 包含至少1个小写字母 包含至少1个数字 不能以数字开头 不包含特殊字符 我已经做到了:Javascript HTML5模式正则表达式密码匹配,javascript,regex,Javascript,Regex,正在查找有关使用以下规则验证密码的帮助: 8个以上字符 包含至少1个大写字母 包含至少1个小写字母 包含至少1个数字 不能以数字开头 不包含特殊字符 我已经做到了: (?=.*\d.*)(?=.[a-z].*)(?=.[a-z].*)(?=.[!\$%&\?])。{8,} 但似乎不知道如何使第一个数字与某个数字不匹配,并将特殊字符类设置为不匹配。非常感谢您的帮助。以下是我的建议: (?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*[!#\$%&\?])^\D.{7}
(?=.*\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方法的值。我知道好的干净的代码很重要,但对于不懂语法的人来说,简化语法似乎有些过头了。比如用英语写一本书,这样法国人就可以读了。