2011-10-05 5 views
7

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) 
+0

あなたの回答の後に調査し、上部のC文字(&#0043)が下部のC文字(&#1057)と異なることに気付きました。最後の3行のC文字はキリル文字から来ているようです。 http://webdesign.about.com/od/localization/l/blhtmlcodes-ru.htm – lemiorhan

+0

問題はユーザーの入力によって発生します。入力が英数字であるかどうかを確認するには、org.apache.commons.lang.StringUtils.isAlphanumeric()がtrueを次のように返します。assertTrue(StringUtils.isAlphanumeric( "\ u0421 \ u0421")) ; //キリル文字C assertTrue(StringUtils.isAlphanumeric( "\ u00E7 \ u00E7")); // ascii C – lemiorhan

答えて

15

最後の3 ASCII "C" の文字とない実際スタートを行います。彼らは "C"のように見える非ASCII文字で始まります。これは[0-9A-Za-z]のセットには一致しないため、パターンは失敗します。

(私はコピーすることによってこれを発見し、ひどくも非ASCII文字を処理しないテキストエディタにコードを貼り付け - 「?」。彼らは通りに出てきた)

+0

正しいC文字のHEXコードは '0x3F'ですが、以前の' C'は '0x43'です – sll

+1

@sll:いいえ、3Fは"? "です。そうでなければ表現することができない文字を表現するためによく使われる。表示されている文字は「*」ではありませんか? –

+0

良いキャッチ!私の編集者が保存する前にこの文字を '?'で置き換えたように見えます。 – sll

2

あなたの「СС3966」(私は'切削と貼り付け')がUTF-8以外のものとしてフラグ付けされているため、reg-exがそれらと一致しません。私はあなたのテキストを変更し、自分自身を入力すると、期待どおりに動作します。これらの値をどこからコピーしたのか分かりませんが、それはあなたの問題です

+0

私はあなたの意見を持っています。あなたはJonSkeetとしてこの問題を発見しました。あなたの答えに感謝します。 – lemiorhan

+0

それは面白いです...ジョンと私は同じ答えを見つけた、私はそれが1分前にそれを見つけた...彼は12 upvotesを取得、私は1を得る:)これは人気のコンテストのように見える!笑。 –

+1

btw、あなたの試合に私の試合を貼り付けて保存しようとしたとき、私はUTF-8以外のテキストを保存しようとしているというダイアログを表示しました。私はEclipseの設定をまったく変更していないと思うので、あなたはこのような将来の問題に対してあなたに同じ警告を出さない理由を知るべきです。 –