这是:
/(?=^.{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");
答案 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