- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
根据 How to determine whether a character is a letter in Java? 的回答我在用下面的代码片段匹配字符串是否在开头包含 unicode 字母。它在 unicode 字符的 Java 6 上运行良好\u0374 未被视为 unicode 字母
boolean test = "\u0374100".matches("[\\p{L}].*");; returns true on java 7 whereas it return false java 6.
关于这个观点,Java 7 有什么变化吗?如果是,如何让 Java 6 的东西在 Java 7 上运行?
最佳答案
根据 Fileformat.Info: Unicode Character 'GREEK NUMERAL SIGN' (U+0374) ,类别为“字母,修饰符 [Lm]”。它还表示 Character.isLetter()
的结果是 Yes。
现在将其与 Unicode Character 'GREEK LOWER NUMERAL SIGN' (U+0375) 进行对比其类别为“符号,修饰符 [Sk]”。根据页面,Character.isLetter()
的结果是No。
Java 7 根据 Character javadoc 使用 Unicode 6.0.0和 Internationalization Enhancements in Java SE 7 ,而 Java 6 使用 Unicode 4.0(请参阅 Character javadoc 和 Java Language Specification 5.0(适用于 Java 5 和 6))。
原因是 unicode 现在将 U+0374 定义为“字母,修饰符”。查看 Unicode 4.0.0 的 unicode 数据库和 Unicode 6.0.0很明显,定义从 Sk 更改为 Lm:
4.0 版:
0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;;
版本 6.0.0:
0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;;
换句话说:你的正则表达式工作正常,只是字符定义发生了变化,所以它现在被认为是一个字母,而不是一个符号。
关于java - 为什么此正则表达式不适用于 Java 7?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21140343/
我是一名优秀的程序员,十分优秀!