关于javascript:密码REGEX,最少6个字符,至少一个字母和一个数字,可能包含特殊字符

Password REGEX with min 6 chars, at least one letter and one number and may contain special characters

我需要一个有条件的正则表达式:

  • 最少6个字符,最多50个字符
  • 必须包含1个字母
  • 必须包含1个数字
  • 可能包含特殊字符,如!"${$%^"和(*)(+)

目前我有模式:(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{6,50})$

但是它不允许特殊字符,有人有一个好的regex吗?

谢谢


也许可以使用一个regex,但这使得很难向用户反馈他们不遵守的规则。类似这样的更传统的方法会给您提供反馈,您可以在用户界面中使用这些反馈来告诉用户哪些PWD规则没有得到满足:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function checkPwd(str) {
    if (str.length < 6) {
        return("too_short");
    } else if (str.length > 50) {
        return("too_long");
    } else if (str.search(/\d/) == -1) {
        return("no_num");
    } else if (str.search(/[a-zA-Z]/) == -1) {
        return("no_letter");
    } else if (str.search(/[^a-zA-Z0-9\!\@\#\$\%\^\&\*\(\)\_\+]/) != -1) {
        return("bad_char");
    }
    return("ok");
}

根据jfriend00的回答,我写了这个小提琴来测试他的解决方案,并做了一些小改动,使其更直观:

http://jsfiddle.net/9rb49/1/

这就是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
checkPwd = function() {
    var str = document.getElementById('pass').value;
    if (str.length < 6) {
        alert("too_short");
        return("too_short");
    } else if (str.length > 50) {
        alert("too_long");
        return("too_long");
    } else if (str.search(/\d/) == -1) {
        alert("no_num");
        return("no_num");
    } else if (str.search(/[a-zA-Z]/) == -1) {
        alert("no_letter");
        return("no_letter");
    } else if (str.search(/[^a-zA-Z0-9\!\@\#\$\%\^\&\*\(\)\_\+\.\,\;\:]/) != -1) {
        alert("bad_char");
        return("bad_char");
    }
    alert("oukey!!");
    return("ok");
}

顺便说一句,它的工作方式很有魅力!;)

致以最诚挚的问候,当然还要感谢JFFriends00!


与这些(常见)密码要求相匹配的更优雅、自包含的regex是:

1
^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d^a-zA-Z0-9].{5,50}$

这里的优雅之处在于,您不必硬编码符号,如$@等。要接受所有符号,您只需说:"接受所有非字母数字字符,而不是数字"。regex {5,50}的最后一部分可以很容易地更改,并对应最小和最大字符数:在这个特定的示例中,直到5个字符,regex返回一个不匹配的字符(即需要至少6个字符进行验证)。同样,在50个字符之后,它也返回一个不匹配项。


  • 检查仅包含字符、数字、下划线的7到16个字符之间的密码,第一个字符必须是字母-


    /^[A-Za-z]\w{7,14}$/

  • 检查包含至少一个数字、一个大写字母和一个小写字母的6到20个字符之间的密码。


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

  • 请检查包含至少一个数字和一个特殊字符的7到15个字符之间的密码。


    /^(?=.[0-9])(?=.[!@#$%^&])[a-zA-Z0-9!@#$%^&]{7,15}$/

  • 检查包含至少一个小写字母、一个大写字母、一个数字数字和一个特殊字符的8到15个字符之间的密码。


    /^(?=.\d)(?=.[a-z])(?=.[A-Z])(?=.[^a-zA-Z0-9])(?!.*\s).{8,15}$/

  • 我希望这能帮助别人。有关更多信息,请查看本文和此网站regexr.com。


    我有一个正则表达式,但有点棘手。

    1
    ^(?:(?<Numbers>[0-9]{1})|(?<Alpha>[a-zA-Z]{1})|(?<Special>[^a-zA-Z0-9]{1})){6,50}$

    让我解释一下,以及如何检查测试密码是否正确:

    regex中有三个命名组。1)"数字":将匹配字符串中的单个数字。2)"alpha":将匹配从"a"到"z"或"a"到"z"的单个字符。3)"特殊":将匹配不是"字母"或"数字"的单个字符。

    这三个命名组被分组到一个可选组中,{6,50}建议regex machine捕获上面提到的至少6个组,但不超过50个。

    为了确保输入正确的密码,您必须检查是否有匹配的密码,然后检查匹配的组是否如您所希望的那样被捕获。我是C开发人员,不知道它在JavaScript中是如何工作的,但在C中,您必须检查:

    1
    match.Groups["Numbers"].Captures.Count > 1

    希望它在JavaScript中也能工作!祝你好运!


    我用这个

    1
    2
    3
    4
    export const validatePassword = password => {
      const re = /^(?=.*[A-Za-z])(?=.*\d)[a-zA-Z0-9!@#$%^&*()~¥=_+}{":;'?/>.<,`\-\|\[\]]{6,50}$/
      return re.test(password)
    }