正则表达式验证八个或更多必须至少包含两个非字母字符的字符字符串

时间:2018-07-22 08:21:26

标签: java regex

我正在验证的密码字符串必须由八个或更多字符组成,并且必须使用正则表达式至少包含两个非字母(即,不是A-Za-z)字符。

到目前为止,我的代码是

Pattern p = Pattern.compile("((?=2.*[^a-z[A-Z]]).{8,})");
    Matcher m = p.matcher(pass);

我不知道我的表达是否正确。

1 个答案:

答案 0 :(得分:0)

  

我想使用八个或更多字符来验证密码,并且必须至少包含两个非字母(即非A-Z)字符

您可以使用

s.matches("(?=(?:[^a-zA-Z]*[a-zA-Z]){2}).{8,}")

请参见regex demo

另一种书写方式

s.matches("(?=.{8})(?:[^a-zA-Z]*[a-zA-Z]){2}.*")

说明

  • ^-(在.matches中不是必需的,因为该方法需要完整的字符串匹配)-字符串的开头
  • (?=-正向前瞻的开始,需要立即在当前位置的右侧,
    • (?:[^a-zA-Z]*[a-zA-Z]){2}-与以下两个连续出现的匹配的非捕获组:
      • [^a-zA-Z]*-ASCII字母以外的任何0+个字符
      • [a-zA-Z]-ASCII字母
  • )-前瞻结束
  • .{8,}-除换行符以外的任何8个或更多字符,尽可能多
  • $-(在.matches中不是必需的,因为该方法需要完整的字符串匹配)-字符串的结尾

(?=.{8})(?:[^a-zA-Z]*[a-zA-Z]){2}.*模式中,第一个前瞻至少需要8个字符,然后使用(?:[^a-zA-Z]*[a-zA-Z]){2}模式至少需要两个字母,然后.*与字符串的其余部分匹配。