为什么 String.replaceAll() 在 Java 8 中的工作方式与 Java 9 不同?

2022-08-31 15:26:53

为什么此代码以 输出,但以 或更高版本输出?02o2

"o2".replaceAll("([oO])([^[0-9-]])", "0$2")

答案 1

很可能是由于 JDK-6609854JDK-8189343 报告了负嵌套字符类处理(在您的示例中)。此行为已在 9 和 10 中修复,但修复未向后移植到 8。Java 8 的错误解释如下:[^[0-9-]]

在Java中,否定不适用于嵌套中出现的任何内容[brackets]

因此,与“c”不匹配,正如您所期望的那样。[^c]

[^[c]] 与“c”匹配。不是我所期望的。

[[^c]]与“c”不匹配

这同样适用于范围或属性表达式 - 如果它们在括号内,则 out 级别的否定不会影响它们。

[^a-z]与 相反[^[a-z]]


答案 2