我一直在寻找接受至少两位数字和一个特殊字符且最小密码长度为 8 的正则表达式。到目前为止,我已经完成了以下操作:[0-9a-zA-Z!@#$%0-9]*[!@#$%0-9]+[0-9a-zA-Z!@#$%0-9]*
user2902617
问问题
34481 次
6 回答
33
像这样的东西应该可以解决问题。
^(?=(.*\d){2})(?=.*[a-zA-Z])(?=.*[!@#$%])[0-9a-zA-Z!@#$%]{8,}
(?=(.*\d){2}) - uses lookahead (?=) and says the password must contain at least 2 digits
(?=.*[a-zA-Z]) - uses lookahead and says the password must contain an alpha
(?=.*[!@#$%]) - uses lookahead and says the password must contain 1 or more special characters which are defined
[0-9a-zA-Z!@#$%] - dictates the allowed characters
{8,} - says the password must be at least 8 characters long
它可能需要一些调整,例如准确指定您需要哪些特殊字符,但它应该可以解决问题。
于 2013-10-21T10:35:27.967 回答
8
无论如何,没有理由在单个正则表达式中实现所有规则。考虑这样做:
Pattern[] pwdrules = new Pattern[] {
Pattern.compile("........"), // at least 8 chars
Pattern.compile("\d.*\d"), // 2 digits
Pattern.compile("[-!"§$%&/()=?+*~#'_:.,;]") // 1 special char
}
String password = ......;
boolean passed = true;
for (Pattern p : pwdrules) {
Matcher m = p.matcher(password);
if (m.find()) continue;
System.err.println("Rule " + p + " violated.");
passed = false;
}
if (passed) { .. ok case.. }
else { .. not ok case ... }
这样做的另一个好处是可以毫不费力地添加、删除或更改密码规则。它们甚至可以驻留在一些资源文件中。
此外,它更具可读性。
于 2013-10-21T10:45:57.187 回答
4
试试这个:
^(?=.*\d{2,})(?=.*[$-/:-?{-~!"^_`\[\]]{1,})(?=.*\w).{8,}$
以下是它的工作原理:
(?=.*\d{2,})
这部分说除了至少2位数(?=.*[$-/:-?{-~!"^_
[]]{1,})` 这些是特殊字符,至少 1(?=.*\w)
和其余是任何字母(等于[A-Za-z0-9_]
).{8,}$
这个至少包含 8 个字符,包括所有以前的规则。下面是当前正则表达式的地图(在Regexper的帮助下制作) UPD
正则表达式应如下所示^(?=(.*\d){2,})(?=.*[$-\/:-?{-~!"^_'\[\]]{1,})(?=.*\w).{8,}$
查看评论以获取更多详细信息。
于 2013-10-21T10:35:54.993 回答
3
试试这个正则表达式。它使用前瞻来验证至少有两位数字和您列出的特殊字符之一。
^(?=.*?[0-9].*?[0-9])(?=.*[!@#$%])[0-9a-zA-Z!@#$%0-9]{8,}$
解释
^ #Match start of line.
(?=.*?[0-9].*?[0-9]) #Look ahead and see if you can find at least two digits. Expression will fail if not.
(?=.*[!@#$%]) #Look ahead and see if you can find at least one of the character in bracket []. Expression will fail if not.
[0-9a-zA-Z!@#$%0-9]{8,} #Match at least 8 of the characters inside bracket [] to be successful.
$ # Match end of line.
于 2013-10-21T10:28:08.503 回答
0
正则表达式在您尝试匹配的字符串上定义了一个结构。除非您在正则表达式上定义空间结构(例如,至少两位数字后跟一个特殊字符,然后是 ...),否则您不能使用 aregex
来验证您的字符串。
于 2013-10-21T10:36:27.990 回答
-1
于 2013-10-21T10:33:08.757 回答