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é
相关产品推荐
相关产品推荐

