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

Javascript正则表达式密码验证问题,javascript,regex,validation,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.inp

我目前正在做一个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个字符时,这是不可能不做的。这是最奇怪的事情,这个表达真的有效

如果有人对此有任何意见,我将不胜感激。
谢谢

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

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

您的2大写、2小写和2数字模式是错误的。您应该使用以下内容:

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

编辑
请注意:

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

我希望这会有所帮助。

您在代码中使用的一种模式与您可能想要的有所不同:

    var re = /^(?=.*\d)\w{2,}$/;
前瞻,
(?=.*\d)
,不使用字符串中的任何字符。它向前看定位点,以匹配模式
*\d
。如果字符串中有一个数字(即,后面跟一个数字的任意字符数),则前瞻将返回成功匹配

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

结果是,该模式将匹配由至少包含一个数字的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]/;

不要强迫用户使用短密码。请给出确切的要求。我不明白为什么在你用第一个检查涵盖所有案例时要做这么多检查。到底是什么问题?什么输入在不经意地触发了什么规则?还有什么在无关紧要的地方做?你当然不需要。好的,我会澄清的。当我运行这段代码时,基本上——它不能正常工作(或者更确切地说,正如我所希望的那样)。我想要一个验证的东西,每种至少需要两个字符。(数字,上,下)。这段代码无法做到这一点,例如,如果我键入“Ab1234”,它就会通过,即使我只使用一个大写字母和一个小写字母。如果我设置的标准中有一个匹配,它就会得到批准。如果没有这些警报,这并不难。如代码中所述,我需要针对每个特定输入失败发出警报。有没有其他方法可以做到这一点,或者我错过了什么?你的正则表达式太复杂了<代码>/[A-Z].*?[A-Z]/和类似的代码就足够了。所以我错过了。。一个点?多方便啊。无论如何,我非常爱你,谢谢你帮我解决这个问题。它解决了我的问题。干杯@user2395622:我更新了我的答案,添加了一些可能有用(或不有用)的信息/注意事项。顺便说一句,你没有漏掉一点。您使用的是positive look aheads(这根本不符合您的目的)。总是乐于助人:DIt没关系,用你们的代码,^和*之间的“点”解决了它。所以在这种情况下,我的代码不是“或”的意思?对吗?因为现在它功能齐全了,你的代码是“和”(但模式错误)。另请参阅drf的答案,以了解有关外观的更多信息(意外?)在原始代码中使用的位置。我可以向您保证,如果我自己决定,我不会这样做。这是针对一所大学的远程课程,它是基于我们自己查找信息(有点奇怪),但在我们进入javascript部分之前没有任何问题。无论如何,谢谢你!非常感谢。我明天再读一遍,等我睡了一会儿!