答案 0 :(得分:63)
最可能是由于JDK-6609854和JDK-8189343报告了负面的嵌套字符类处理(在您的示例[^[0-9-]]
中)。此行为已在9和10中修复,但未将其反向移植到8。Java 8的错误解释为:
在Java中,否定不适用于 嵌套的
[brackets]
所以
[^c]
与您期望的“ c”不匹配。
[^[c]]
与“ c”匹配。不是我所期望的。
[[^c]]
与“ c”不匹配范围或属性表达式也是如此-如果它们是 在内括号中,否定的否定不影响它们。
相反
[^a-z]
与[^[a-z]]