Java 16中正则表达式\p{Cs}无法匹配Java 11兼容符号原因问询
版本间匹配行为差异原因
\p{Cs}的正则语义是匹配Unicode分类中的代理项(Surrogate),仅对孤立存在、无法组成有效代理对的高/低代理码点生效,由有效代理对组成的完整辅助平面字符不属于Cs分类。- Java 11及更早版本的正则匹配默认按UTF-16代码单元(16位
char类型)逐个遍历字符串。你构造的字符串由高代理码点55622(U+D866)、低代理码点56380(U+DF3C)两个char组成,旧版本会单独判定两个char的分类都为Cs,因此匹配结果为true。 - Java 16对正则匹配逻辑做了变更:默认基于Unicode完整代码点遍历字符串,会自动将有效代理对识别为单个完整的Unicode字符。你构造的两个代理码点组成了完整的CJK统一表意文字扩展B字符
U+2683C,分类为Lo(其他字母),不属于Cs分类,因此匹配结果为false。
如果需要在Java 16中复现旧版本的匹配行为,可以在编译正则时显式关闭Unicode字符类默认配置:
// 0表示不开启任何flag,回退到旧版本按UTF-16代码单元匹配的逻辑 Pattern.compile("\\p{Cs}", 0).matcher(text).find()
内容的提问来源于stack exchange,提问作者Sandro Batista Santos
相关产品推荐
相关产品推荐

