Очевидно, с 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