如何在这个'密码复杂性'正则表达式中允许下划线

时间:2010-09-15 21:13:21

标签: regex

这是:

/(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/

只有当密码包含大写和小写字母,并且还包含1位数或1个特殊字符时,它才会通过,但是我希望下划线_也算作特殊字符,而且它目前没有,如何修改这个正则表达式,以便它允许下划线计为一个特殊字符?

编辑:这是背景......

jQuery.validator.addMethod("complexity", function(value, element) {
    return this.optional(element) || /(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/.test(value);
}, "password is not complex, see requirements above");

5 个答案:

答案 0 :(得分:21)

/(?=^.{8,}$)((?=.*\d)|(?=.*[\W_]+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/

aioobe与[\ _ W _]

紧密取代\ W.

您知道这会将空间视为特殊角色。

此外,我没有看到你在哪里检查数字。编辑:没关系,我发现了它。 (人复杂的正则表达式就像沃尔多一样。)

这是一个简化版本,不允许使用空格(并且易于维护)

(?=^.{8,}$)(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])(?=^.*[^\s].*$).*$
^          ^          ^          ^            ^
|          |          |          |            L--does not contain a whitespace
|          |          |          L--at least one non word character(a-zA-Z0-9_) or _ or 0-9
|          |          L--at least one upper case letter
|          L--at least one lowercase Letter
L--Number of charaters

这些是你的构建块

(?=.*[a-z]) // Whatever is inside the [] meens the string contains at least one charter inside that set.
            // If you wanted a minimum of three lowercase letters you can chain the inner block like so 
               (?=(.*[a-z]){3,})

答案 1 :(得分:7)

你想在一个正则表达式中做所有这些的特殊原因吗?在我看来,如果你把它分解下来,那将会更具可读性:

 if (password.length() < 8) return "Password too short!";
 if (!password.matches("\d")) return "Password must contain at least one digit!";
 if (!password.matches("[A-Z]")) return "Password must contain at least one uppercase leter!";
 if (!password.matches("[a-z]")) return "Password must contain at least one lowercase leter!";

 // Password is valid, save it, etc.

答案 2 :(得分:4)

我认为你的\W表示一个特殊字符(通常定义为“非字字符”)

因此,如果您想将_添加到该组字符中,您应该可以编写[\W_]

(根据Scott Chamberlains评论更新。)


我不确定你为什么(?![.\n])。您想阻止密码换行吗?

否则,这看起来像一个简化的正则表达式:

String regexp = "(?=^.{8,}$)(?=.*[A-Z])(?=.*[a-z])(?=.*[\\W_\\d]).*$";
for (String s : new String[] {
        "abcdefg",
        "abcdefgh",
        "abCdefgh",
        "abc1efgh",
        "abC1efgh",
        "abC1e@gh",
        "abC1e_gh"}) {

    System.out.println(s + " is " + (s.matches(regexp) ? "ok" : "not ok"));

}

打印

abcdefg is not ok
abcdefgh is not ok
abCdefgh is not ok
abc1efgh is not ok
abC1efgh is ok
abC1e@gh is ok
abC1e_gh is ok

答案 3 :(得分:4)

您认为这是一个可接受的密码吗?

Aa8 ½ý_

因为你的正则表达式匹配它。您可能希望将第一个前瞻从(?=^.{8,}$)更改为(?=^[!-~]{8,}$),从而限制了打印ASCII字符的可能性(即,不是空格或控制字符)。如果你想允许非ASCII字符,它会变得更复杂; JavaScript正则表达式不能很好地执行Unicode。

以下是我将如何编写正则表达式:

/^(?=[!-~]{8,}$)(?=.*[A-Z])(?=.*[a-z])(?=.*[^A-Za-z]).*$/

像斯科特一样,我没有看到这一点:(?![.\n])。它所做的就是确保第一个字符不是句号或换行符。这不是你(或原作者)的意思,但我甚至无法猜出实际意图是什么。

答案 4 :(得分:3)

对于未来的搜索者,这是我的实现,包括需要特殊字符和数字:

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

继承人example