【发布时间】:2011-10-05 16:20:47
【问题描述】:
我遇到了一个关于 String 的 matches(RegExp) 方法的有趣问题。
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 字符 (+) 与低位 C 字符 (С) 不同。最后 3 行中的 C 字符似乎来自西里尔字母。 webdesign.about.com/od/localization/l/blhtmlcodes-ru.htm
-
问题是由于用户输入造成的。要检查输入是否为 alpha-decimal(即使对于 Cyrillic C),org.apache.commons.lang.StringUtils.isAlphanumeric() 将返回 true,如下所示:assertTrue(StringUtils.isAlphanumeric("\u0421\u0421")) ; // 西里尔 C assertTrue(StringUtils.isAlphanumeric("\u00E7\u00E7")); // ascii C