无法弄清楚上述条件的正则表达式

时间:2017-09-03 07:17:24

标签: java regex string

我最近遇到了#book1的概念,并准备仅使用regex regex matches()length()方法来解决问题。问题与密码匹配有关。这是需要考虑的三个条件:

  • 密码必须至少包含八个字符。
  • 密码仅包含字母和数字。
  • 密码必须至少包含两位数字。

我能够通过使用其他各种StringString类方法来解决此问题,但我需要仅通过 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");

}
}

2 个答案:

答案 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          
      }