Сопоставитель шаблонов Java 21 и Java 17

В настоящее время я пытаюсь запустить проект с Java 21, который в настоящее время без проблем работает с Java17.

Для некоторых наших шаблонов регулярных выражений есть совпадения с Java21, которые не совпадают с Java17, и наоборот.

Это можно воспроизвести с помощью этого простого кода:

      public static void main(String[] args) {
        //english
        test(
                "...their sample variance, and σ2N their population variance.",
                "(?<![A-Z\\$€£¥฿฿=]-?[0-9\\.]{0,5})((\\b|\\-)[0-9]{1,5}[0-9,.]{0,5}(€|¥|฿|฿|°C|°F|°De?|°R[éeøa]?|(Z|E|P|T|G|M|k|h|da|d|c|m|µ|n|f|z|y)[ΩΩm]|[ΩΩ]|(Z|E|P|T|G|M|k|h|da|d|c|m|µ|n|p|f|a|z|y)?N|[kKMGTPEZY]i?B|[kmµnp]g|[Mk]t|kWh|GWa|MWd|MWh)(?!\\w))",
                true,
                null);
        //french
        test(
                "Il a été mis au banc de la société.",
                "\\bau (banc) (?:des nations|de la (?:société|ville|communauté|France)|de l['´‘’′](?:Europe|empire|église|islam))\\b",
                false,
                "au banc de la société");
    }

    private static void test(String text, String regex, boolean caseSensitive, String expected) {
        int flags = caseSensitive ? 0 : Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE;
        Pattern pattern = Pattern.compile(regex, flags);
        Matcher matcher = pattern.matcher(text);
        int start = 0;
        String match = null;
        while (matcher.find(start)) {
            match = text.substring(matcher.start(), matcher.end());
            start = matcher.end();
        }
        System.out.println("Expected: " + expected);
        System.out.println("Got: " + match);
    }

Вывод с Java 17:

      Expected: null
Got: null
Expected: au banc de la société
Got: au banc de la société

Вывод с Java 21:

      Expected: null
Got: 2N
Expected: au banc de la société
Got: null

Ожидайте того же поведения в Java 21, что и в Java 17.

1 ответ

возможно, «Класс символов Regex \b теперь по умолчанию соответствует только символам ASCII (JDK-8264160)»; менее вероятно «Поддержка Unicode 14.0 (JDK-8268081)» (оба из примечаний к выпуску Java 19); или «Поддержка Unicode 15.0 (JDK-8284842)» (примечания к выпуску Java 20) –user85421 2 дня назад

Другие вопросы по тегам