Jin*_*Kim 5 java regex unicode astral-plane
我目前正在使用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. java.util.regex
应该足够巧妙地将这两个数字(Java字符)解释为模式和字符串中的单个字符(尽管Java仍将它们视为两个字符,作为字符串的元素).
两个链接:
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());
Run Code Online (Sandbox Code Playgroud)
这是用Java 6编译的,打印出来的
true len=11
false len=11
Run Code Online (Sandbox Code Playgroud)
与上述内容一致.在第一种情况下,我们有一个代码点,表示为一对代理java字符(两个16位字符,一个超级Unicode字符),{2}
量词适用于该对(= codepoint).在第二个中,我们有两个不同的BMP字符,量词适用于最后一个 - 因此,没有匹配.
但请注意,字符串长度是相同的(因为Java测量的字符串长度计算Java字符,而不是Unicode代码点).
归档时间: |
|
查看次数: |
2358 次 |
最近记录: |