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 ()+-_.]*$。この正規表現には、英字 (大文字と小文字)、数字、スペース、括弧、およびいくつかの句読点の文字クラスがあります。句読点文字の 1 つにピリオドがあります。ピリオドはエスケープされないため、任意の文字 (セミコロンを含む) の本来の意味を持ちます。

この正規表現は、任意の文字列に一致します。これは基本的に^.*$.

これを修正するには、ピリオドをエスケープします。

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

編集:

そこには特別な意味を持つ、私が見逃していた別のアイテムがあることがわかりました. 「+-_」の文字クラスのハイフンは、「プラス、ハイフン、またはアンダースコア」を意味するものではありません。むしろ、0x2B から 0x5F までのすべての文字を意味します。Aと P は 0x41 と 0x50 であり、悪名高いセミコロンは 0x3B であり、すべて 0x2B から 0x5F の範囲内であるため、簡単なテストで^[+-_]*$も一致することがわかります。AP;

正しい正規表現は次のとおりです。

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

于 2013-02-18T18:34:53.673 に答える