对于包含分号的输入,Perl5Matcher.matches(input,pattern)返回true,即使分号不在模式中也是如此

时间:2013-02-18 17:51:32

标签: java pattern-matching

我有一个字符串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;
}

有人可以解释为什么分号一直被允许通过吗?

1 个答案:

答案 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 ()+\\-_\\.]*$"