让我们在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
,这是没有预料到的。为什么会这样?
答案 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。