我最近遇到了#book1
的概念,并准备仅使用regex
regex
matches()
内length()
方法来解决问题。问题与密码匹配有关。这是需要考虑的三个条件:
我能够通过使用其他各种String
和String
类方法来解决此问题,但我需要仅通过 Character
来完成这些操作。我是什么意思我试过帮助我处理大多数测试用例,但其中一些(测试用例)仍然失败。因为,我正在学习regex
实现,所以请帮助我解决我所缺少或做错的事情。以下是我的尝试:
regex
修改
好的所以我想出了第一个和第二个案例,因为我在附加第三个案例时遇到问题,即包含至少2个数字。
public class CheckPassword {
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
System.out.println("Enter your password:\n");
String str1 = sc.next();
//String dig2 = "\\d{2}";
//String letter = ".*[A-Z].*";
//String letter1 = ".*[a-z].*";
//if(str1.length() >= 8 && str1.matches(dig2) &&(str1.matches(letter) || str1.matches(letter1)) )
if(str1.length() >= 8 && str1.matches("^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d{2,})(?=.*[0-9])[A-Z0-9a-z]+$"))
System.out.println("Valid Password");
else
System.out.println("Invalid Password");
}
}
答案 0 :(得分:2)
您实际上可以在matches()
内使用单个正则表达式来验证所有3个条件:
\p{Alnum}{8,}
(?=(?:[a-zA-Z]*\d){2})
正面预测结合所有三个:
.matches("(?=(?:[a-zA-Z]*\\d){2})\\p{Alnum}{8,}")
由于matches()
方法默认锚定模式(即需要完整的字符串匹配),因此不需要^
和$
个锚点。
<强>详情
^
- 隐含在matches()
- 字符串的开头(?=(?:[a-zA-Z]*\d){2})
- 一个积极的前瞻((?=...)
),需要正好存在两个序列:
[a-zA-Z]*
- 零个或多个ASCII字母\d
- ASCII数字\p{Alnum}{8,}
- 8个或更多字母数字字符(仅限ASCII)$
- 隐含在matches()
- 字符串结尾。答案 1 :(得分:1)
好的,谢谢你@TDG和M.Aroosi给你宝贵的时间。我已经找到了解决方案,这个解决方案满足所有情况
// answer edited based on OP's working comment.
String dig2 = "^(?=.*?\\d.*\\d)[a-zA-Z0-9]{8,}$";
if(str1.matches(dig2))
{
//body
}