验证密码的完美解决方案

时间:2015-02-14 16:52:22

标签: javascript regex

我参加了在线JavaScript测试,其中第3个问题如下:

完成checkPassword功能,该功能应检查密码参数是否符合以下规则:

  • 必须超过6个字符。
  • 允许的字符包括大写拉丁字母字符(a-z),数字(0-9)和特殊字符+,$,#,\,/。
  • 不得有3个或更多连续数字(例如" pass12p"很好, 但是" pass125p"不是,因为它包含" 125")

>

我的解决方案如下:



function checkPassword(password) {
  return /^[a-zA-Z0-9\+\$\\\/#]{6,}$/.test(password) && !/[0-9]{3,}/.test(password);
}




此解决方案为我提供了给定输入的正确输出。

但是最终的测试结果表明,解决方案只有75%是正确的。

我认为完美的答案应该只是一个正则表达式的解决方案。有没有人可以给我一个正则表达式给出相同的结果?我不太擅长正则表达,所以请指教。

我提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

一开始就使用negative lookahead

^(?!.*?\d{3})[a-zA-Z0-9\+\$\\\/#]{6,}$

(?!.*?\d{3})在开始时断言匹配将不包含至少三个连续数字。然后,仅当满足此条件时,正则表达式引擎才会尝试将模式[a-zA-Z0-9\+\$\\\/#]与输入字符串匹配6次或更多次。

DEMO

答案 1 :(得分:0)

 ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d]{6,}$

连续号码检查

    public boolean isValid(final String userName,final String password) { 
    for(int i=0;(i+2)<userName.length();i++) if(password.indexof(userName.substring(i,i+2))!=-1) return false; return true; 
}