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

Java 8 为什么String.replaceAll()在Java8和Java9中的工作方式不同?,java-8,java-9,java,regex,string,Java 8,Java 9,Java,Regex,String,为什么此代码输出的02in而o2in或更高 "o2".replaceAll("([oO])([^[0-9-]])", "0$2") 最有可能是由于和报告了负嵌套字符类处理(在您的示例中为[^[0-9-]])。此行为在9和10中得到了修复,但修复没有后端口到8。Java 8的错误解释为: 在Java中,否定不适用于出现在 嵌套的[括号] 因此,[^c]与“c”不匹配,正如您所期望的那样 [^[c]]与“c”匹配。不是我所期望的。 [[^c]]与“c”不匹配 对于范围或属性表达式,如果它们是 在括

为什么此代码输出的
02
in而
o2
in或更高

"o2".replaceAll("([oO])([^[0-9-]])", "0$2")
最有可能是由于和报告了负嵌套字符类处理(在您的示例中为
[^[0-9-]]
)。此行为在9和10中得到了修复,但修复没有后端口到8。Java 8的错误解释为:

在Java中,否定不适用于出现在 嵌套的
[括号]

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

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

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

对于范围或属性表达式,如果它们是 在括号内,外一级的否定不影响它们

[^a-z]
[^[a-z]]


您无法证明正则表达式与regex101处的字符串不匹配,它不支持字符类并集。在PCRE中,
[^[0-9-]
匹配的字符不是
[
、数字和
-
,然后是
]
@WiktorStribiżew删除,谢谢。您会推荐其他支持它们的在线工具吗?如果不明显,OP可以通过将
[^[0-9-]]
更改为
[^0-9-]
来修复这种不一致性。代码的简化仍然显示了行为:
模式。匹配([^[x]],“x”)
使用JDK8返回true,使用JDK9+返回false。