我正在尝试编写一个正则表达式,如果[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。我已经使用前瞻性实现了
答案 0 :(得分:1)
如果我正确理解了您的问题,则要检查
首先,仅使用正则表达式对字符计数和 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)