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

问题描述 投票:62回答:1

为什么这个代码在02中输出,在o2或更高的位置输出

"o2".replaceAll("([oO])([^[0-9-]])", "0$2")
java regex string java-8 java-9
1个回答
64
投票

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

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

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

[^[c]]确实匹配“c”。不是我所期待的。

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

对于范围或属性表达式也是如此 - 如果它们在括号内,则在out级别的否定不会影响它们。

[^a-z][^[a-z]]相对

© www.soinside.com 2019 - 2024. All rights reserved.