java - 找出上述条件的正则表达式

标签 java regex string

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

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

我能够通过使用各种其他 StringCharacter 类方法来解决这个问题,但我需要仅通过 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/

相关文章:

javascript - 替换字符以制作国际字母(变音符号)

python - 写一个正则表达式,更好的解决方案

java - 如何在 Android 中将 String[] 转换为 String,反之亦然

java - 正则表达式匹配其中包含特殊字符的文本

java - Java中如何将无效字符更改为有效字符?

c# - 带分隔符的字节正则表达式

java - 将 2D CharArray 转换为 String 并使用 .charAt() 比较字符是否正确?

javascript - 如何删除字符串的第一个和最后一个字符

java - Netty 示例中 ctx.read() 与 ctx.channel.read() 的使用

java - 有人可以看看我的代码并告诉我哪里出了问题吗?