我最近遇到了 regex
的概念,并准备使用 matches()
和 中的
方法。问题与密码匹配有关。以下是需要考虑的三个条件:regex
来解决这个问题String
类的 >length()
- 密码必须至少包含八个字符。
- 密码仅由字母和数字组成。
- 密码必须至少包含两位数。
我能够通过使用各种其他 String
和 Character
类方法来解决这个问题,但我需要仅通过 regex
。我尝试过的方法对大多数测试用例都有帮助,但其中一些(测试用例)仍然失败。因为,我正在学习 regex
实现,所以请帮助我我错过了什么或做错了什么。以下是我的尝试:
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");
}
}
编辑
好吧,我想出了第一个和第二个案例,只是我在附加第三个案例时遇到了问题,即至少包含 2 位数字。
if(str1.length() >= 8 && str1.matches("[a-zA-Z0-9]*"))
//works exclusive of the third criterion
最佳答案
您实际上可以在 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()
中 - 字符串结尾。
关于java - 找出上述条件的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46021129/