Java正则表达式匹配字符串密码。

3

我最近在教科书中遇到了这个问题:

我需要编写一个方法来检查字符串是否具有以下内容:

  1. 至少十个字符
  2. 只有字母和数字
  3. 至少三个数字

我尝试使用正则表达式来解决它,而不是逐个字符迭代; 这是我目前的代码:

String regx = "[a-z0-9]{10,}";

但这只能满足前两个条件。我应该如何处理第三个条件?

可能是使用正则表达式进行密码匹配的重复问题。 - Ken White
非常感谢,我应该在提问之前先搜索一下 >< - Milk_QD
1个回答

4
你可以使用正向预查来满足第三个条件,用如下方式实现:

你可以这样写:

^(?=(?:.*\d){3,})[a-z0-9]{10,}$
  • ^ 表示字符串的开头。
  • (?= ... ) 是正向前瞻,它将搜索整个字符串以匹配 (?=) 之间的任何内容。
  • (?:.*\d){3,} 匹配字符串中至少有三个数字。
    • .*\d 匹配任何(或无)字符后跟数字(如果省略,则只匹配连续数字)。
    • {3,} 匹配三个或更多的 .*\d
    • (?: ... ) 是非捕获组。
  • $ 表示字符串的结尾。

非常感谢您的详细解释。由于这是我第一次遇到正向先行断言和 ?:,所以我还有点困惑。我目前的理解是,正向先行断言允许(?:.*\d){3,}搜索整个字符串。而 ?: 允许 .*\d{3} 匹配任意三个数字,但不记住它们,因此它不会对最终的 {10,} 产生影响。 - Milk_QD
这种形式的正则表达式只能在Java中与Pattern类一起使用,而不能与String类的方法(如.matches()和.replaceAll())一起使用。 - Milk_QD
@Anlinyang 是的,你理解的前瞻是正确的,?: 允许使用括号来分组表达式(例如 .*\d)而不捕获它(你需要将表达式分组才能在其上应用 {3,})。你可以不使用 ?: 来使用相同的表达式,它仍然可以工作。 - Gerry
@Anlinyang 我不确定,我不是Java专家,但据我所知,String类方法接受简单的正则表达式,所以我猜你需要先创建一个模式,然后将字符串与之匹配。 - Gerry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接