使用java中的regex进行密码验证

时间:2013-01-29 11:44:54

标签: java regex

我必须创建一个匹配

的密码验证的正则表达式

例如

  

abcdABCD1234 $%^

密码必须包含至少两个小写,两个大写,两个数字和两个特殊字符。但他们可以提供超过这个标准

注意 - 模式应该是有序的。

String pattern="(?=.*[a-z]{2,})(?=.*[A-Z]{2,})(?=.*[0-9]{2,})(?=.*[@#$%&]{2,})";

它对我有用,但它不是检查订单 手段 AB大写字母或任何字符不应出现在ab(小写)之前。

你明白了吗。

     String minNum="4";
     String max="20";

     String REGEX="(^(?!.*(d))(?=.*[a-z]{3,})(?=.*[A-Z]{2,})(?=.*[0-9]{3,})(?=.[@#$%&*><?+]{2,})^(?!.*(#r)).{"+minNum+","+max+"})";
     //String regex="(?=.*[a-z]{2,})(?=.*[A-Z]{2,})(?=.*[0-9]{2,})(?=.*[@#$%&]{2,})";

      String INPUT ="acABC1333323@#";

   Pattern p = Pattern.compile(REGEX);

   Matcher m = p.matcher(INPUT);

   System.out.println(m.matches());

它正常工作但我在更改密码时 “ABac1333323 @#”;它也匹配但是根据我的要求它是正确的,因为AB是第一顺序。

3 个答案:

答案 0 :(得分:3)

要求字符处于特殊顺序是我听过的最奇怪的密码要求,我无法相信您的客户真的想要这个。

说明这一点,我可以向你解释你的正则表达式。

当您所需的字符可以按任何顺序排列时,通常会使用您在正则表达式中使用的lookahead assertions(?=...)内容)。如果你真的没有这个要求,那么你的正则表达式很简单,你只需要跳过你的前瞻。

这符合您的要求:

String pattern="[a-z]{2,}[A-Z]{2,}[0-9]{2,}[@#$%&]{2,}";

如果您想要允许密码中的所有字母,数字和所有其他字符,请使用Unicode代码属性:

String pattern="p{Ll}{2,}p{Lu}{2,}\d{2,}[^\p{L}\d]{2,}";

答案 1 :(得分:0)

也许它可以帮到你:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PwdValidator{

      private Matcher match;
      private Pattern pattern;
      private static final String PWD_PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})";

      public PwdValidator(){
          pattern = Pattern.compile(PWD_PATTERN);
      }


      public boolean validate(final String pwd){
          match = pattern.matcher(pwd);
          return match.matches();
      }
}

答案 2 :(得分:0)

我认为这就是你想要的

(?=[a-z]{2,}).{2,}(?=[A-Z]{2,}).{2,}(?=\d{2,}).{2,}(?=[@#$%&]{2,}).{2,}

匹配 abcdABCD1234$%^abABcdCD1234$%^

不符合 ABababcdCD1234$%^ABac1333323@#

对于两个或更多小写,然后是两个或更多大写后跟两个或更多个数字后跟两个或更多特殊字符,请使用:

[a-z]{2,}[A-Z]{2,}\d{2,}[@#$%&]{2,}