正则表达式,用于查找字符串中的1到3个字符

时间:2018-07-29 08:19:01

标签: java regex

我正在尝试编写一个正则表达式,如果[A-Za-z]出现在1到3之间,则应该返回true,但是我无法做到这一点

public static void main(String[] args) {
    String regex = "(?:([A-Za-z]*){3}).*";
    String regex1 = "(?=((([A-Za-z]){1}){1,3})).*";

    Pattern pattern = Pattern.compile(regex);
    System.out.println(pattern.matcher("AD1CDD").find());
}

注意:对于连续的3个字符,我可以编写它,但是我想要实现的是,对于整个字符串,出现的次数应该在1到3之间。如果有4个字符,则应返回false。我已经使用前瞻性实现了

3 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则要检查

  • 字符串中[a-zA-Z]的1到3个字符
  • 其他任何字符都可以经常出现吗?

首先,仅使用正则表达式对字符计数和 not 效率更高,因为这不是常规语言问题,而是微不足道的计数问题。使用for循环可解决此问题没有什么问题(除了Python和R之类的解释器可能相当慢)。

不过,您可以(ab-)使用扩展的正则表达式:

^([^A-Za-z]*[A-Za-z]){1,3}[^A-Za-z]*$

一旦您还对“其他”字符进行建模,这将非常简单。这就是定义模式应该执行的操作:对所有接受的字符串(即整个“语言”)建模,不仅是要查找的那些字符。

或者,您可以“ findAll”匹配([A-Za-z]),并查看结果的长度。如果您还需要实际的字符,这可能会更方便。

for循环如下所示:

public static boolean containsOneToThreeAlphabetic(String str) {
    int matched = 0;
    for(int i=0; i<str.length; i++) {
        char c = str.charAt(i);
        if ((c>='A' && c<='Z') || (c>='a' && c<='z')) matched++;
    }
    return matched >=1 && matched <= 3;
}

这是直接,可读,可扩展和高效的(使用编译语言)。您还可以添加if (matched>=4) return false;(或break)来提前停止。

答案 1 :(得分:-1)

请停止使用正则表达式,不仅会使您自己的生活变得复杂,还会使将来必须处理您的代码的人们的生活变得复杂。选择一种更简单的方法,找到所有[A-Za-z]+字符串,将它们放入列表中,然后检查每个字符串,如果长度在1到3之间或超出长度。

答案 2 :(得分:-2)

Regex

/([A-Za-z])(?=(?:.*\1){3})/s

正在寻找一个字符,并对其进行3次重复。因此,如果匹配,则存在4个或更多相等的字符。