在Java中使用String.matches()

时间:2012-01-14 09:01:46

标签: java

让我们在Java中看到关于String.matches()的以下表达式。

System.out.println("55CCEE".matches("[0-9A-Za-z]{6}"));  //true
System.out.println("CC77HH".matches("[0-9A-Za-z]{6}"));  //true
System.out.println("CC1156".matches("[0-9A-Za-z]{6}"));  //true

System.out.println("С".matches("[0-9A-Za-z]{1}"));       //false
System.out.println("СС".matches("[0-9A-Za-z]{2}"));      //false
System.out.println("СС5588".matches("[0-9A-Za-z]{6}"));  //false
System.out.println("СС5589".matches("[0-9A-Za-z]{6}"));  //false

前三个案例看起来很好并按预期工作。然而其余的案例似乎都失败了,并且返回了false,这是没有预料到的。为什么会这样?

2 个答案:

答案 0 :(得分:10)

在第二组中,您的字符串中没有C,您有С,其中0xd0 0xa1为UTF-8。

这个字符是西里尔字母 - CYRILLIC CAPITAL LETTER ES。请参阅unicode.org上的Cyrillic code chart (PDF)

答案 1 :(得分:2)

失败行中的“C”字符是与[A-Z]字符类中的C不同的Unicode字符。

    int unicodeFrom3rdLine = 'C';
    int unicodeFrom4thLine = 'С';
    System.out.println(Integer.toHexString(unicodeFrom3rdLine));
    System.out.println(Integer.toHexString(unicodeFrom4thLine));

产生

    43
    421

即使它们看起来一样,它们实际上是不同的角色,前者是正常的C而后者是Cyrillic