java regex string java-8 java-9

¿Por qué String.replaceAll() funciona de manera diferente en Java 8 de Java 9?



regex java-8 (1)

Muy probablemente debido a JDK-6609854 y JDK-8189343 que reportaron manejo de clases de caracteres anidadas negativas (en su ejemplo [^[0-9-]] ). Este comportamiento se corrigió en 9 y 10, pero la corrección no se realizó en la versión 8. El error para Java 8 se explica como

En Java, la negación no se aplica a nada que aparezca [brackets] anidados

Entonces [^c] no coincide con "c", como cabría esperar.

[^[c]] coincide con "c". No es lo que esperaría.

[[^c]] no coincide con "c"

Lo mismo se aplica a los rangos o expresiones de propiedad: si están entre corchetes, una negación en un nivel externo no los afecta.

[^az] es opuesto a [^[az]]

¿Por qué este código da salida 02 en java-8 pero o2 en java-9 o superior?

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