为什么此正则表达式不匹配

时间:2019-10-20 21:53:01

标签: java type-conversion equals

我正在构建一个正则表达式模式来验证我输入的String。 这是我必须包括的限制;

The letters a to z (upper and lowercase) (zero or many times)
o The numbers 0 to 9 (between zero and three times)
o The ampersand (&) character (zero or may times)
o The space character (zero or one time)

这是我在

上构建和测试的正则表达式
[a-zA-Z&]*|[0-9]{0,3}|[\s]?

String p1 = "[a-zA-Z\\&]*|[0-9]{0,3}|[\\s]?" ;
        if (bankName.matches(p1) && bankName.length() >= 8) {
            System.out.println("Yes");
        }
        else{
            System.out.println("NO");
        }

这是我要测试的条目。

tXiPkaodan57yzrCxYjVT
String bankName = "tXiPkaodan57yzrCxYjVT" ;

我正在测试正则表达式的站点不匹配,因为数字(5和7)开始并且在字母之间,但是我在regex模式中包括应该可以包含从0-的任何数字9次,0-3次 https://www.freeformatter.com/java-regex-tester.html#ad-output 我在

上测试过的网站

1 个答案:

答案 0 :(得分:0)

正则表达式中的竖线(“或”)具有最高优先级,因此该正则表达式为:

如果输入恰好是以下之一,则进行匹配:

  1. 0个或多个与所有字母(大小写)或“&”号匹配的字符,
  2. 0到3位之间的任何地方
  3. 0或1个空格。

您的输入与这些无关。这是这些东西的混合体。例如,输入“ a1a”与您的正则表达式不匹配,因为,请逐步执行:“ a”强制正则表达式匹配器选择上面3个选项中的第一个,即是。现在没有回头路了。您的正则表达式将与a匹配,在1上不匹配,这就是结尾。

那么,您如何解决呢?不坚持使用正则表达式;这不是解决此问题的好方法。正好满足您要求的正则表达式非常复杂。

相反,为什么不循环遍历每个字符并有4个计数器(空格,数字,字母和其他东西)。对于每个字符,增加右计数器。然后最后检查“其他填充”计数器是否为0,数字是否为3或更少,空格是否为1或更少,然后才有效。否则,不是。