微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java是否支持其正则表达式库中的非BMP Unicode字符即,代码点> 0xFFFF?

如何解决Java是否支持其正则表达式库中的非BMP Unicode字符即,代码点> 0xFFFF?

| 我当前正在使用Java 6(我没有选择迁移到Java 7的选项),并且我试图使用java.util.regex包对包含Unicode字符的字符串进行模式匹配。 我知道java.lang.String支持补充字符(即,代码点> 0xFFFF的字符)(自Java 5起),但是我看不到使用这些字符进行模式匹配的简单方法。 java.util.regex.Pattern仍然仅允许使用4位数字表示十六进制(例如\\ uFFFF) 有人知道我是否在这里缺少API吗?     

解决方法

我从未用补充字符完成模式匹配,但是我认为这就像将它们(在模式和字符串中)编码为两个16位数字(一个UTF-16代理对)\\ unnnn \\ ummmm一样简单。 “ 0”应该足够聪明,可以将这两个数字(Java字符)解释为模式和字符串中的单个字符(尽管Java仍会将它们视为两个字符,作为字符串的元素)。 两个链接: Java Unicode编码 http://java.sun.com/developer/technicalArticles/Intl/Supplementary/ 从最后一个链接(参考Java 5):   java.util.regex软件包已经被   更新,以便两个模式字符串   并且目标字符串可以包含   补充字符,这将   作为完整的单位处理。 还请注意,如果您使用UTF8作为编码(用于源文件),则也可以直接编写它们(请参见最后一个链接中的\“在源文件中代表补充字符\”一节)。 例如:
    String pat1 = \".*\\uD840\\uDC00{2}.*\";
    String s1  = \"HI \\uD840\\uDC00\\uD840\\uDC00 BYE\";
    System.out.println(s1.matches(pat1) + \" len=\" + s1.length());

    String pat2 = \".*\\u0040\\u0041{2}.*\";
    String s2 = \"HI \\u0040\\u0041\\u0040\\u0041 BYE\";
    System.out.println(s2.matches(pat2) + \" len=\" + s2.length());
使用Java 6编译的版本可打印
true len=11
false len=11
与上述观点一致。在第一种情况下,我们有一个代码点,表示为一对替代java字符(两个16位字符,一个补充Unicode字符),并且
{2}
量词适用于该对(= codepoint)。在第二个中,我们有两个不同的BMP字符,量词适用于最后一个-因此,没有匹配项。 但是请注意,字符串长度是相同的(因为Java测量的是计算Java字符而不是Unicode代码点的字符串长度)。     ,最简单的解决方案是对您的源代码使用UTF-8编码。然后直接将字符放进去。您永远都不必在任何程序中指定单独的代码单元。 但是,字符类仍然存在问题,因为Java公开暴露的UTF-16内部编码将它们弄乱了。在JDK7之前,您无法使用完整的Unicode,即使在JDK7上,也必须使用间接的
\\x{HHHHH}
表示法指定逻辑代码点。您仍然无法在charclass中拥有任何文字代码点,但是可以使用
\\x{H..H}
躲避它。 不完美,但比以前要好得多。 UTF-16始终是一种折衷方案。内部使用UTF-8或UTF-32的系统没有这些限制。它们也永远不会使您指定与代码点不同的代码单位。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。