【问题标题】:why this regex is not working on java 7?为什么这个正则表达式不适用于 java 7?
【发布时间】:2014-01-15 14:40:42
【问题描述】:

根据How to determine whether a character is a letter in Java? 的回答,我正在使用 下面的代码 sn-p 以匹配字符串是否在开头包含 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 上工作?

【问题讨论】:

    标签: java regex java-7 java-6


    【解决方案1】:

    根据Fileformat.Info: Unicode Character 'GREEK NUMERAL SIGN' (U+0374),类别为“字母,修饰符[Lm]”。它还说Character.isLetter() 的结果是Yes

    现在将其与具有类别“符号,修饰符 [Sk]”的Unicode Character 'GREEK LOWER NUMERAL SIGN' (U+0375) 进行对比。根据页面,Character.isLetter() 的结果是No

    Java 7 根据Character javadocInternationalization Enhancements in Java SE 7 使用Unicode 6.0.0,而Java 6 使用Unicode 4.0(参见Character javadocJava Language Specification 5.0(适用于Java 5 和6)。

    原因是 unicode 现在将 U+0374 定义为“字母,修饰符”。查看Unicode 4.0.0Unicode 6.0.0 的unicode 数据库,很明显定义从Sk 更改为Lm

    4.0 版:

    0374;希腊数字符号;Sk;0;ON;02B9;;;;N;希腊大写数字符号;Dexia keraia;;;

    版本 6.0.0:

    0374;希腊数字符号;Lm;0;ON;02B9;;;;N;希腊大写数字符号;;;;

    换句话说:你的正则表达式工作正常,只是字符定义发生了变化,所以它现在被认为是一个字母,而不是一个符号。

    【讨论】:

    • 我能否确认“Java 6 使用的 unicode 版本不同,或者 Oracle 更改了 Character.isLetter() 对类别“字母,修饰符 [Lm]”的响应方式。”在 Java 7 的发布文档中?它 oracle 已经改变了它应该在 doc 中的某个地方的行为。对吗?
    • 我相信他们更改了 unicode 版本,但我找不到参考。
    • Java 6 使用 Unicode 标准版本 4,而 7 使用版本 6。它记录在 Character 类 javadoc here
    • @PopoFibo 我找到了;我在看文档时错过了它。
    • @user3198603 我删除了我的说法,即它可能是“字母,修饰符”的处理方式,因为版本 6 和 7 的 Javadoc 都声称该类别被视为字母。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2010-10-21
    • 2014-01-03
    • 2019-04-07
    • 2022-08-18
    • 2010-09-22
    相关资源
    最近更新 更多