如何使用正则表达式在 lookhead 中给出范围,例如 ^(?=(.*[a-z]){1,3})(?=.*[0-9]).{2,5}$

How to give range in lookhead using regex e.g ^(?=(.*[a-z]){1,3})(?=.*[0-9]).{2,5}$

Question-
1]String length is 2 to 5 
2]String contains at least 1 char and maximum 3 char
3]Atleast one number 

我想使用 lookhead。 我试过但没有用 ^(?=(.[a-z]){1,3})(?=.[0-9]).{2,5}$

尝试使用以下正则表达式

(?=([\w\W]{2,5}$))(?=(.*([0-9]){1,}.*))^[^A-Za-z]*[A-Za-z](?!(?:[^A-Za-z]*[A-Za-z]){3})

public static void main(String[] args) {
    String regex = "(?=([\w\W]{2,5}$))(?=(.*([0-9]){1,}.*))^[^A-Za-z]*[A-Za-z](?!(?:[^A-Za-z]*[A-Za-z]){3}).*";

    Pattern pattern = Pattern.compile(regex);
    System.out.println(pattern.matcher("AB2").find()); // output true
    System.out.println(pattern.matcher("AB2C").find()); // output true
}

您可以使用正向先行断言字符串的长度为 2-5 个字符,并且至少有 1 个数字和 1 个字符 [a-z]。要确保最多有 3 个字符可以使用否定前瞻来断言您不匹配一个字符 4 次。

^(?=[a-z0-9]{2,5}$)(?=.*[a-z])(?=.*[0-9])(?!(?:.*[a-z]){4})[a-z0-9]+$

Regex demo

说明

  • ^ 断言行的开始
  • (?=[a-z0-9]{2,5}$ 肯定前瞻断言 2 -5 个字符
  • (?=.*[a-z]) 肯定前瞻断言 1 个字符
  • (?=.*[0-9]) 肯定前瞻断言 1 个数字
  • (?!(?:.*[a-z]){4}) 否定前瞻不匹配一个字符 4 次
  • [a-z0-9]+$ 匹配一个字符或数字一次或多次,直到字符串结束

Demo