1

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

谁能解释为什么分号一直被允许通过?

4

1 回答 1

1

问题在于您定义的正则表达式 - ^[a-zA-Z0-9 ()+-_.]*$。在这个正则表达式中是一个由字母(大写和小写)、数字、空格、括号和一些标点符号组成的字符类。标点符号之一是句号。句号没有转义,因此它具有任何字符(包括分号)的本义。

此正则表达式将匹配任何字符串 - 它本质上是^.*$.

要解决此问题,请避开该时期。

Pattern sepMatchPattern = sepMatchCompiler.compile("^[a-zA-Z0-9 ()+-_\\.]*$");

编辑:

事实证明,我错过了另一个具有特殊含义的项目。“+-_”字符类中的连字符不表示“加号、连字符或下划线”。相反,它表示从 0x2B 到 0x5F(包括)的所有字符。一个快速测试表明这^[+-_]*$也匹配AP;,因为 A 和 P 是 0x41 和 0x50,而臭名昭著的分号是 0x3B - 都在 0x2B 到 0x5F 的范围内。

正确的正则表达式是:

"^[a-zA-Z0-9 ()+\\-_\\.]*$"

于 2013-02-18T18:34:53.673 回答