使用Java正则表达式匹配一系列Unicode代码点_outside_ BMP:它有可能吗?

时间:2014-11-12 22:22:58

标签: java regex unicode

虽然起初完全不相关,this question让我想知道......

Java的正则表达式基于String s; Stringchar s的序列(数组); char最终是UTF-16代码单元。

后者意味着单个char可以匹配BMP中的任何Unicode代码点,即从U + 0000到U + FFFF。

然而,在BMP之外,单个代码点需要两个char(一个用于主要代理,另一个用于尾随代理);从我所看到的,除了专用的语法引擎,我还没有看到Java正则表达式(由java.util.regex.Pattern定义)来定义"字符类"对于这样的代码点,因为BMP之外的代码点没有字符串文字。

尽管代码可以编写以生成此类范围的正则表达式(以及用作正则表达式的字符串文字),但Pattern中是否存在未记录的现有机制并允许那样做?

1 个答案:

答案 0 :(得分:2)

好的,所以,回答自己;从this question提取的数据以及answer指向的相关@DavidWallace

有可能。用这样的角色来解释答案:

"[\uD83D\uDE01-\uD83D\uDE4F]"

Java正则表达式引擎足够智能,可以注意到您在间隔的两端指定了代理对,并相应地“编译”了正则表达式。

此外,从Java 7 开始,您还可以使用\x{foo},其中foo是代码点的十六进制表示形式。不要忘记Java字符串文字中必需的引用,因此可以写上面的内容:

"[\\x{1F601}-\\x{1F64F}]"