题解 | #密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
^(?![A-Za-z]+$)(?![A-Z\\d]+$)(?![A-Z\\W_]+$)(?![a-z\\d]+$)(?![a-z\\W_]+$)(?![\\d\\W_]+$)\\S{8,}$
拆分解释:
- (?![A-Za-z]+$)匹配后面不全是(大写字母或小写字母或大小写组合)的情况,排除了(1)全是大写字母(2)全是小写字母(3)大小写组合的情况三种情况
- (?![A-Z\d]+$)同理,排除了(1)大写字母(2)数字(3)大写和数字组合
- (?![A-Z\W_]+$)同理,排除了(1)大写字母(2)特殊字符(因为\W中不包括_所以需要在\W后加上_,\W中最前面的\是转义字符)(3)大写字母和特殊字符
- (?![a-z\d]+$)同理,排除了(1)小写字母(2)数字(3)小写字母和数字
- (?![a-z\W_]+$)同理,排除了(1)小写字母(2)特殊字符(3)小写字母和特殊字符
- (?![\d\W_]+$)同理,排除了(1)数字(2)特殊字符(3)数字和特殊字符
- \S 表示,非空白就匹配,\\S中最前面的\为转义字符(排除了1. 到6. 再匹配的所有就是至少三种以上的组合了)
3.不能有长度大于2的包含公共元素的子串重复
.*(.{3,}).*\\1.*
拆分解释:
1)(.{3,}):括号中的字符被正则表达式视为一个分组,即分组匹配,题解代表任意字符出现3次以上作为一个分组;
2)\num:即为引用子模式num匹配到的字符串;num为子模式的编号. (分组匹配也可称为子模式匹配)。子模式编号:整个正则表达式作为一个模式编号为“0”,其余子模式从左至右从 1 - 99 依次编号,最大编号为99;
3).* : 代表任意字符出现0次或多次,因为相同子串可能相连也可能被其他字符割开;
连起来就是:匹配任意字符组成的长度至少为3的字符子串出现2次的结果。
作者:NJingZYuan
链接:https://www.jianshu.com/p/f5e64223a3ef
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextLine()) { // 注意 while 处理多个 case String password = in.nextLine(); boolean flag = password.matches("^(?![A-Za-z]+$)(?![A-Z\\d]+$)(?![A-Z\\W_]+$)(?![a-z\\d]+$)(?![a-z\\W_]+$)(?![\\d\\W_]+$)\\S{8,}$") && !password.matches(".*(.{3,}).*\\1.*"); System.out.println(flag ? "OK" : "NG"); } } }