¿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]
anidadosEntonces
[^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")