Очевидно, с Java 21 теперь определяется в терминах класса символов \ w , который по умолчанию не с поддержкой юникода. Так что теперь a \ b.* внезапно соответствует "aß" . Единственный способ, которым я могу видеть «исправить» \ b ,-это включить флаг Unicode_character_class , но, конечно, изменяется все классы символов, что также отличается от поведения до Java-21. < /p>
Странно, я не могу найти никакой информации об этом нарушительном изменении. Ничто в выпуске Java 21, и различные попытки Google не дали ничего полезного. Для таких нарушающих изменений основных основных либеров я, по крайней мере, ожидал бы большого жира, а также флага функции для повторного определения старого поведения . Кто -нибудь что -нибудь знает об этом? < /P>
mwe: < /p>
Код: Выделить всё
echo 'System.out.println("aß".matches("a\\b.*"))' | /usr/lib/jvm/java-17-openjdk/bin/jshell
vs.
Код: Выделить всё
echo 'System.out.println("aß".matches("a\\b.*"))' | /usr/lib/jvm/java-21-openjdk/bin/jshell -q
Подробнее здесь: https://stackoverflow.com/questions/794 ... ode-change