我有一个字符串MyString = "AP;";
或包含;
当我尝试验证MyString与模式匹配时
例如。 MyPattern = "^[a-zA-Z0-9 ()+-_.]*$";
我相信应该允许AlphaNumerics和字符()+ -_。] * 但不允许;
但是以下声明返回True!
Pattern sepMatchPattern = sepMatchCompiler.compile("^[a-zA-Z0-9 ()+-_.]*$");
Perl5Matcher matcher = new Perl5Matcher();
if (matcher.matches("AP;", sepMatchPattern)) {
return true;
} else {
return false;
}
有人可以解释为什么分号一直被允许通过吗?
答案 0 :(得分:1)
问题在于您定义的正则表达式 - ^[a-zA-Z0-9 ()+-_.]*$
。在这个正则表达式中是alpha(上部和下部),数字,空格,圆括号和一些标点符号的字符类。其中一个标点字符是句点。句点不会被转义,因此它具有任何字符的原始含义(包括半冒号)。
此正则表达式将匹配任何字符串 - 它基本上是^.*$
。
要解决这个问题,请逃离这段时间。
Pattern sepMatchPattern = sepMatchCompiler.compile("^[a-zA-Z0-9 ()+-_\\.]*$");
编辑:
事实证明,我在那里错过了另一件具有特殊意义的物品。字符类“+ -_”中的连字符不表示“加号,连字符或下划线”。相反,它表示从0x2B到0x5F(包括)的所有字符。快速测试显示^[+-_]*$
也匹配AP;
,因为A和P是0x41和0x50,臭名昭着的分号是0x3B - 都在0x2B到0x5F的范围内。
正确的正则表达式是:
"^[a-zA-Z0-9 ()+\\-_\\.]*$"