Связь между классами символов Alnum и IsAlphabetic в шаблонах Java RegEx - PullRequest
1 голос
/ 18 апреля 2019

Глядя на Javadoc для java.util.regex.Pattern

\p{Alnum} Буквенно-цифровой символ: [\p{IsAlphabetic}\p{IsDigit}]

похоже, что каждый символ, который соответствует \p{IsAlphabetic}, должен также соответствовать \p{Alnum}

Однако, похоже, это не тот случай, когда у персонажа есть акцент. Например, следующее утверждение не выполняется:

assertEquals("é".matches("\\p{IsAlphabetic}+"),"é".matches("\\p{Alnum}+"));

То же самое происходит с другими персонажами с акцентами, такими как ą, ó, ł, ź ż. Все соответствуют \p{IsAlphabetic}+, но не \p{Alnum}+

Я неправильно истолковал Javadoc? Или это ошибка в документации или реализации?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

По умолчанию \p{Alnum} рассматривается как класс символов POSIX, что означает, что он всегда будет соответствовать только символам ASCII.Это означает, что он будет соответствовать a и 1, но не ä или ١.

Цитируемый вами отрывок применяется только при использовании флага UNICODE_CHARACTER_CLASS.

Слегка упрощенно этот флаг превратит "старые" классы символов стиля POSIX в их эквивалентные классы символов Unicode.

1 голос
/ 18 апреля 2019

Ваша цитата из документации в порядке , но вы пропустили прочитать строку перед этой таблицей:

Следующие Предопределенные классы символов и Классы символов POSIX соответствуют рекомендации Приложение C: Свойства совместимости из Регулярное выражение Unicode , при UNICODE_CHARACTER_CLASS флаг

Если вы прочитаете страницу документации, на которую ссылаетесь, то увидите, что \p{Alnum} = [\p{Alpha}\p{Digit}] и \p{Alpha} = [\p{Lower}\p{Upper}] и \p{Lower} = [a-z] и \p{Upper} = [A-Z].

Итак, \p{Alnum} соответствует только буквам (и цифрам) ASCII, когда флаг UNICODE_CHARACTER_CLASS не установлен, а \p{L} (= \p{IsAlphabetic}) соответствует всем Unicodeбуквы по умолчанию (флаг не требуется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...