文章目录
链接:密码验证合格程序
来源:牛客网
问题描述:
解题思路:
观察题意密码要求:
1.长度超过8位(最好解决)
2.包括大小写字母.数字.其它符号,以上四种至少三种(不好弄)
3.不能有相同长度超2的子串重复,说明:长度超过2的子串(不好弄)
经过看大佬的博客,发现了String类中有一个String.matches() ,这个方法主要是返回是否匹配指定的字符串,如果匹配则为true,否则为false;
这个方法可以完美的解决密码的剩下的要求,但是呢里边要涉及到正则表达式,这里又是很多人的痛点,所以这里是那个大佬的博客链接:String.matches()的用法
解题代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
while (scanner.hasNextLine()) {
String input = scanner.nextLine();
//counter的作用是验证要求2:至少三种输入类型,每当密码中有一个类型时就+1
int counter = 0;
//这个下边可能就是你懵逼的开始,所以我把下边用到的正则表达式给你一一写出来
if (input.matches(".*\\d.*"))
counter++;
if (input.matches(".*[a-z].*"))
counter++;
if (input.matches(".*[A-Z].*"))
counter++;
if (input.matches(".*[^a-zA-Z0-9].*"))
counter++;
//&&之前是为了验证要求1和2,&&之后是为了验证要求3
if (input.length() > 8 &&counter >= 3 && !input.matches(".*(...).*\\1.*"))
System.out.println("OK");
else
System.out.println("NG");
}
}
}
}
扩充知识:
1.String.matches()用法:
2.有关代码里用到的正则表达式:
表达式 | 可匹配 |
---|---|
. | 匹配除了换行符(\n)以外的任意一个字符 |
* | 不出现或出现任意次,相当于 {0,},比如:"^*b"可以匹配 “b”,"^^^b"… |
\\ | 代表\本身 |
\d | 任意一个数字,0~9 中的任意一个 |
[a-z] | 匹配 “a”~“z” 之间的任意一个字母 |
[A-Z] | 匹配 “A”~“Z” 之间的任意一个字母 |
[^a-zA-Z0-9] | 匹配 “a”-“z”,“A”-“Z”,“0”-“3” 之外的任意一个字符 |
(…).*\1 | 为了匹配长度超过2的字符串,一旦重复返回true |
正则表达式中的小括号"()"是代表分组的意思,注意:\1必须与小括号配合使用 | 如果再其后面出现\1则是代表与第一个小括号中要匹配的内容相同。 |