使用正则表达式进行密码验证(包含字母和数字以及特殊)。{8,}

时间:2013-03-05 20:03:22

标签: java regex

我需要知道正则表达式是如何用于以下情况的:

  • 至少8个字符( ... ).{8,}
  • 有字母(?=.*[a-z|A-Z])
  • 有号码(?=.*\d)
  • 有特殊字符(?=.*[~'!@#$%?\\\/&*\]|\[=()}"{+_:;,.><'-])

我在其他正则表达式中得到以下内容:

((?=.*\d)(?=.*[a-z|A-Z])(?=.*[~'!@#$%?\\\/&*\]|\[=()}"{+_:;,.><'-])).{8,}

但它失败了:

qwer!234

任何提示?

4 个答案:

答案 0 :(得分:4)

在Java正则表达式中,由于字符串转义规则,您需要加倍反斜杠:

Pattern regex = Pattern.compile("^(?=.*\\d)(?=.*[a-zA-Z])(?!\\w*$).{8,}");

应该有用。

<强>解释

^              # Start of string
(?=.*\d)       # Assert presence of at least one digit
(?=.*[a-zA-Z]) # Assert presence of at least one ASCII letter
(?!\w*$)       # Assert that the entire string doesn't contain only alnums
.{8,}          # Match 8 or more characters

答案 1 :(得分:1)

对于所有这些特殊字符,你很可能没有正确地逃避一切。

你说Java对吗?这会打印true

String regex = "((?=.*\\d)(?=.*[a-zA-Z])(?=.*[~'!@#$%?\\\\/&*\\]|\\[=()}\"{+_:;,.><'-])).{8,}";
System.out.println("qwer!234".matches(regex));

但这有点简单:

String regex = "(?=.*?\\d)(?=.*?[a-zA-Z])(?=.*?[^\\w]).{8,}";

答案 2 :(得分:1)

为什么要将这一切都放在一个正则表达式中?只需为每个检查创建单独的函数,您的代码将更容易理解和维护。

if len(password) > 8 &&
   has_alpha(password) &&
   has_digit(password) &&
    ...

您的业务逻辑立即变得无法承受。另外,当你想添加一些其他条件时,你不必修改棘手的正则表达式。

答案 3 :(得分:0)

Pattern letter = Pattern.compile("[a-zA-z]");  
Pattern digit = Pattern.compile("[0-9]");  
Pattern special = Pattern.compile ("[!@#$%&*()_+=|<>?{}\\[\\]~-]");  
Pattern eight = Pattern.compile (".{8}");  
...  
public final boolean ok(String password) {  
   Matcher hasLetter = letter.matcher(password);  
   Matcher hasDigit = digit.matcher(password);  
   Matcher hasSpecial = special.matcher(password);  
   Matcher hasEight = eight.matcher(password);  
   return hasLetter.find() && hasDigit.find() && hasSpecial.find()  
      && hasEight.matches();  
}  

它会起作用。