所以规范是:
我认为我可以通过在开头有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();
}
答案 0 :(得分:3)
答案 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}
).*
)字母>
\\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