Stringのmatches(RegExp)メソッドに関する興味深い問題が発生しました。Stringのmatches()メソッドの奇妙な動作
assertTrue("33CCFF".matches("[0-9A-Za-z]{6}"));
assertTrue("CC33FF".matches("[0-9A-Za-z]{6}"));
assertTrue("CC3355".matches("[0-9A-Za-z]{6}"));
assertTrue("CC9955".matches("[0-9A-Za-z]{6}"));
assertTrue("CC3366".matches("[0-9A-Za-z]{6}"));
assertTrue("CC3965".matches("[0-9A-Za-z]{6}"));
assertTrue("CC1961".matches("[0-9A-Za-z]{6}"));
assertTrue("CC9999".matches("[0-9A-Za-z]{6}"));
assertTrue("СС3966".matches("[0-9A-Za-z]{6}")); // failing
assertTrue("СС9965".matches("[0-9A-Za-z]{6}")); // failing
assertTrue("СС9966".matches("[0-9A-Za-z]{6}")); // failing
最後の3つのアサーションが予期せず失敗しています。私はこの奇妙な行動が起こっている理由を見つけることができませんでした。同じ問題がありますか?あなたはなにか考えはありますか?
ところで、質問された場合、私のJava版は以下の通りです。
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
あなたの回答の後に調査し、上部のC文字(&#0043)が下部のC文字(&#1057)と異なることに気付きました。最後の3行のC文字はキリル文字から来ているようです。 http://webdesign.about.com/od/localization/l/blhtmlcodes-ru.htm – lemiorhan
問題はユーザーの入力によって発生します。入力が英数字であるかどうかを確認するには、org.apache.commons.lang.StringUtils.isAlphanumeric()がtrueを次のように返します。assertTrue(StringUtils.isAlphanumeric( "\ u0421 \ u0421")) ; //キリル文字C assertTrue(StringUtils.isAlphanumeric( "\ u00E7 \ u00E7")); // ascii C – lemiorhan