我错过了什么?
您的测试“2@2qwert”和“2@@qwert”与您的正则表达式不正确匹配的原因是因为其中没有任何内容需要至少 6 个小写字母。根据对此问题的其他答案和评论,我会说将您的(?=.*[a-z])
条款替换为(?=(.*?[a-z]){6})
.
可以进行的其他一些小的改进:
- 您可以删除多余的
(?=.*[^a-z])
子句,因为所有这些都是说字符串应该包含至少 1 个非字母,这已经由数字和特殊字符要求确定。
- 将 [0-9] 替换为 \d。
- 在字符匹配 (.*) 之前匹配通配符的 3 个位置中,如果将这些设置为非贪婪的,那么 RegExp 引擎的速度会稍快一些,以便在搜索字符串以进行匹配时减少回溯。这是通过放置一个?之后 * (。*?)。
根据您的正则表达式将其放在一起:
/^(?=.*?\d)(?=(.*?[a-z]){6})(?=.*?[@#$*])\S{8,}$/
这成功匹配您的前 4 个字符串,但不是最后 2 个。
(如果您想要一个可读的验证功能,我的原始回复如下。)
function validate(str)
{
// test for digit
if( !/\d/.test(str) ) return false;
// test for special character
if( !/[@#$*]/.test(str) ) return false;
// test for 6 lowercase letters
var letters = str.match(/[a-z]/g);
return letters != null && letters.length == 6;
}
var tests = [ '2@qwerty', '#1asddfg', 'qwe*yt2u', '#qw2wqia', '2@2qwert', '2@@qwert' ];
for( var i=0 ; i<tests.length ; ++i )
document.writeln(tests[i] + ": " + validate(tests[i]) + "<br/>\n");