Почему String.replaceAll () работает в Java 8 иначе, чем в Java 9? - PullRequest
0 голосов
/ 01 марта 2019

Почему этот код выводит 02 в , но o2 в или выше?

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

1 Ответ

0 голосов
/ 01 марта 2019

Скорее всего из-за JDK-6609854 и JDK-8189343 , которые сообщили об обработке отрицательных вложенных классов символов (в вашем примере [^[0-9-]]).Это поведение было исправлено в 9 и 10, но исправление не было перенесено в 8. Ошибка для Java 8 объясняется следующим образом:

В Java отрицание не применяется квсе, что появляется во вложенном [brackets]

Таким образом, [^c] не соответствует "c", как и следовало ожидать.

[^[c]] соответствует "c".Не то, что я ожидаю.

[[^c]] не соответствует "c"

То же самое верно для диапазонов или выражений свойств - если они находятся в скобках, отрицание вуровень выхода не влияет на них.

[^a-z] противоположен [^[a-z]]

...