Javascript正则表达式密码验证问题

时间:2013-05-17 22:29:47

标签: javascript regex validation

我目前正在进行Javascript密码控制,我必须在密码要求的每一个不匹配时发出警告,这会告诉您输入的确切错误。

我一直在尝试和尝试,但从未找到解决方案。

所以这是代码:

function checkForm(form)
  {

     var re = /^\w{6,10}$/;

    if(!re.test(form.pwd1.value)) {
      alert("Password in-between 6-10 characters");
      form.inputfield.focus();
      return false;
    }

    var re = /^[\w ]+$/;

    if(!re.test(form.pwd1.value)) {
      alert("You need to write something");
      form.inputfield.focus();
      return false;
    }

    var re = /^(?=.*[A-Z])\w{2,}$/;

    if(!re.test(form.pwd1.value)) {
      alert("At least two Upper case");
      form.inputfield.focus();
      return false;
    }


    var re = /^(?=.*[a-z])\w{2,}$/;

    if(!re.test(form.pwd1.value)) {
      alert(" At least two Lower Case letters");
      form.inputfield.focus();
      return false;
    }

    var re = /^(?=.*\d)\w{2,}$/;

    if(!re.test(form.pwd1.value)) {
      alert("At least two numbers");
      form.inputfield.focus();
      return false;
    }

    // validation was successful
    else(alert("Welcome!"));
    return true;
  }

我的问题是控制器按每个字符的一个字符而不是两个字符来结算,但是它需要输入其中一个值中的至少两个,例如。 2x大写,2x小写或2x数字。当需要6个字符时,这是不可能的。这是最奇怪的事情,那个表达确实有效!

如果有人对此有任何意见,我真的很感激。 谢谢!

3 个答案:

答案 0 :(得分:0)

首先,每次都要收到警报框很烦人,但如果它是你想要的,那么就改变你的上部和数字检查模式;

^.*[A-Z]{2,}.*$
^.*[0-9]{2,}.*$
^.*[a-z]{2,}.*$

答案 1 :(得分:0)

你的2-Upper-case,2-Lower-case和2-Number模式是错误的。你应该使用类似的东西:

var re = /^.*([A-Z].*){2,}$/;
var re = /^.*([a-z].*){2,}$/;
var re = /^.*([0-9].*){2,}$/;

请参阅 short demo

修改
请注意:

  • 使用\w,您可以将有效密码字符限制为字母,数字和下划线(更多信息 here )。
  • 根据您提供的规格,您需要2个上部OR 2个下部OR 2个数字。这意味着,如果用户 一次,无法提醒用户,因为他可能会在下一次检查中取得成功。如果所有三个都失败,您必须进行所有三项检查并向用户发出警报。
  • 如果用户输入包含非\w字符的6-10字母密码(例如“abCD56-”),则会提示他“密码应介于6和6之间10个字符“,而他的密码 IS 6-10个字符(不是你想要的字符),所以在这种情况下这个消息会有点误导。

我希望有所帮助。

答案 2 :(得分:0)

您在代码中使用了一种模式,它可以执行与您可能想要的操作不同的操作:

    var re = /^(?=.*\d)\w{2,}$/;

前瞻(?=.*\d)不会消耗字符串中的任何字符。它展望锚点以匹配模式.*\d。如果字符串中有一个数字(即任意数量的字符后跟数字),前瞻将返回成功匹配。

从概念上讲,一旦前瞻返回true,解析器将尝试匹配\w{2,}$,它匹配任意数量的单词字符(字母,数字和_),后跟字符串的结尾。

结果是模式将匹配包含至少包含一个数字的2个或更多单词字符的任何字符串,而不是预期的两个。

作为更正,您有几种选择。由于您的第一个模式确保密码的长度合适,因此您可以将此表达式替换为:

var re = /\d.*\d/;

这将找到一个数字后跟任何字符序列,后跟另一个数字(注意删除^$锚点,因为第一个数字可以出现在字符串中的任何位置)。

相同的概念可以应用于需要两个符号的其他模式:

var re = /^(?=.*[A-Z])\w{2,}$/; becomes var re = /[A-Z].*[A-Z]/;
var re = /^(?=.*[a-z])\w{2,}$/; becomes var re = /[a-z].*[a-z]/;