You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 00:36:02