正则表达式密码 - 小写字母后面不能跟小写字母,反之亦然

时间:2017-08-17 09:49:02

标签: java regex

所以规范是:

  • 10到15个字符
  • 至少有一封小写字母
  • 至少有一个大字母
  • 连续不能有2个小字母或2个大字母(小写字母后面不能跟小字母,大字母后面不能跟大字母)

我认为我可以通过在开头有5到7对字符和1个可选字符来完成此操作,因此可以提供10到15个字符,但这些(以及许多其他测试)每次都返回false。关于方法或语法的任何想法都是不正确的?

感谢

// regex expression
    private static final Pattern PASSWORD_PATTERN = Pattern.compile("^([a-z0-9]?([A-Z0-9][a-z0-9]){5,7}) 
        | ([A-Z0-9]?([a-z0-9][A-Z0-9]){5,7})$");

    // testing
    public static void main(String args[]) {
        System.out.println(verifyPassword("123456789123"));
        System.out.println(verifyPassword("AaAaAaAaAaAa3"));
    }
     // function for checking
     static boolean verifyPassword(String password) {
        final Matcher matcher = PASSWORD_PATTERN.matcher(password);
        return matcher.matches();
    }

2 个答案:

答案 0 :(得分:3)

你可以试试这个:

^(?=.*[A-Z])(?=.*[a-z])(?!.*[A-Z][A-Z])(?!.*[a-z][a-z]).{10,15}$

Demo

答案 1 :(得分:1)

使用需要完整字符串匹配的.matches()方法,您可以使用

"(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?!.*(?:[A-Z]{2}|[a-z]{2}))\\p{Alnum}{10,15}"

<强>详情

  • ^ - 隐式,因为模式在.matches()方法中使用 - 字符串的开头
  • (?=[^A-Z]*[A-Z]) - 除了大写ASCII字母之外的任何0+字符之后必须有一个大写的ASCII字母
  • (?=[^a-z]*[a-z]) - 除了小写ASCII字母之外的任何0+字符后必须有小写的ASCII字母
  • (?!.*(?:[A-Z]{2}|[a-z]{2})) - 除了换行符([A-Z]{2})[a-z]{2})或小写(.*)字母>
  • \\p{Alnum}{10,15} - 10到15个ASCII字母或数字
  • $ - 隐式 - 字符串结束。

查看Java demo

List<String> strs = Arrays.asList("aaaa", "zzzzzzz", "AaAaAaAaAaAa3", "123456789123");
String pat = "(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?!.*(?:[A-Z]{2}|[a-z]{2}))\\p{Alnum}{10,15}";
for (String str : strs)
    System.out.println(str + ": " + str.matches(pat));

输出:

aaaa: false
zzzzzzz: false
AaAaAaAaAaAa3: true
123456789123: false