虽然起初完全不相关,this question让我想知道......
Java的正则表达式基于String
s; String
是char
s的序列(数组); char
最终是UTF-16代码单元。
后者意味着单个char
可以匹配BMP中的任何Unicode代码点,即从U + 0000到U + FFFF。
然而,在BMP之外,单个代码点需要两个char
(一个用于主要代理,另一个用于尾随代理);从我所看到的,除了专用的语法引擎,我还没有看到Java正则表达式(由java.util.regex.Pattern
定义)来定义"字符类"对于这样的代码点,因为BMP之外的代码点没有字符串文字。
尽管代码可以编写以生成此类范围的正则表达式(以及用作正则表达式的字符串文字),但Pattern
中是否存在未记录的现有机制并允许那样做?
答案 0 :(得分:2)
好的,所以,回答自己;从this question提取的数据以及answer指向的相关@DavidWallace。
有可能。用这样的角色来解释答案:
"[\uD83D\uDE01-\uD83D\uDE4F]"
Java正则表达式引擎足够智能,可以注意到您在间隔的两端指定了代理对,并相应地“编译”了正则表达式。
此外,从Java 7 开始,您还可以使用\x{foo}
,其中foo
是代码点的十六进制表示形式。不要忘记Java字符串文字中必需的引用,因此可以写上面的内容:
"[\\x{1F601}-\\x{1F64F}]"