11

我一直在寻找接受至少两位数字和一个特殊字符且最小密码长度为 8 的正则表达式。到目前为止,我已经完成了以下操作:[0-9a-zA-Z!@#$%0-9]*[!@#$%0-9]+[0-9a-zA-Z!@#$%0-9]*

4

6 回答 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

尝试这个 :^.*(?=.{8,15})(?=.*\d)(?=.*\d)[a-zA-Z0-9!@#$%]+$

请阅读以下链接以制定密码正则表达式策略:-

密码规则的正则表达式

于 2013-10-21T10:33:08.757 回答