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

Java 21正则表达式\b单词边界匹配器Unicode语义变更问询

Java 21 正则表达式 \b 单词边界语义的破坏性变更

问题概述

Java 21 中,正则表达式的单词边界匹配器 \b 语义出现重大变化,与 Java 17 及更早版本的 Unicode 兼容行为不一致:

  • Java 17 及之前版本中,\b 基于 Unicode 单词定义,正则表达式 a\b.* 无法匹配字符串 "aß",执行结果为 false。
  • Java 21 中,\b 默认基于非 Unicode 的 \w 字符类定义,导致 a\b.* 现在可以匹配 "aß",执行结果为 true。

临时修复的局限性

启用 UNICODE_CHARACTER_CLASS 标志可以修正 \b 的行为,但该标志会全局改变所有字符类的语义,无法单独恢复 \b 的旧有 Unicode 匹配逻辑,与 Java 21 之前的行为仍存在差异。

官方文档缺失问题

目前在 Java 21 发布说明及公开网络搜索中,均未找到该破坏性变更的相关文档说明。对于核心库的此类变更,认为官方至少应提供明确的变更警告,以及专门用于恢复旧行为的特性标志。

最小可复现示例

Java 17 执行命令与结果

echo 'System.out.println("aß".matches("a\\b.*"))' | /usr/lib/jvm/java-17-openjdk/bin/jshell

输出:false

Java 21 执行命令与结果

echo 'System.out.println("aß".matches("a\\b.*"))' | /usr/lib/jvm/java-21-openjdk/bin/jshell -q

输出:true

内容的提问来源于stack exchange,提问作者Victor Mataré

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:14:50