-6

我必须为匹配的密码验证创建一个正则表达式

例如。

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 是一阶。

4

3 回答 3

3

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

说这个我可以向你解释你的正则表达式。

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

这将符合您的要求:

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,}";
于 2013-01-29T12:30:12.440 回答
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();
      }
}
于 2013-01-29T12:02:54.163 回答
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,}
于 2013-01-29T12:33:04.667 回答