要求:
1.必须包含数字、大小写字母
2.密码位数在8-16位
public static boolean checkPas(String pas) {
Pattern pattern = Pattern.compile("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$");
Matcher matcher = pattern.matcher(pas);
return matcher.matches();
}
解释一下:
- (?=.*\d) :表示必须包含数字
- (?=.*[a-z]):表示必须包含小写字母
- (?=.*[A-Z]):表示必须包含大写字母
- .{8,16}:表示任意字符重复8-16次
需要注意的是为什么使用(?=.*\\d)
便可以保证一定会存在数字呢?
首先要知道?=表示的是零宽断言。?=ing即表示匹配以ing结尾的字符串。例如doing,便是匹配其中的do,注意并不会匹配ing。
那(?=.*\\d)
又代表什么意思呢?
匹配一个字符串,该字符串后接任意字符+数字。这个字符串实际上就是空字符串。因此在正则表达式"^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$"
中。
(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])
都表示匹配那样一个空字符串。也就意味着我们的密码必须包含数字、大小写字母。后续的.{8,16}
则仅代表重复8到16次的任意字符。