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

时间:2019-03-01 14:11:30

标签: java regex string java-8 java-9

为什么此代码为什么在中输出02但在或更高版本中输出o2

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

1 个答案:

答案 0 :(得分:63)

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

  

在Java中,否定不适用于   嵌套的[brackets]

     

所以[^c]与您期望的“ c”不匹配。

     

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

     

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

     

范围或属性表达式也是如此-如果它们是   在内括号中,否定的否定不影响它们。

     

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

相反