Следует иметь в виду, что регулярное выражение Java анализирует строки как наборы кодов Unicode, а не кодовые точки. \p{L}
соответствует любой букве Unicode из плоскости BMP, она не соответствует буквам, наклеенным после них диакритическими знаками.
Поскольку ваш ввод может содержать буквы и диакритические знаки, вы должны по крайней мере использовать классы \p{L}
и \p{M}
Unicode в вашем классе символов:
String regex = "[\\p{L}\\p{M}]+";
Если входная строка может содержать слова, разделенные пробелами, вы можете добавить \s
сокращенный класс и для соответствия любому виду пробелов вы можете скомпилировать это регулярное выражение с флагом Pattern.UNICODE_CHARACTER_CLASS
:
String regex = "(?U)[\\p{L}\\p{M}\\s]+";
Обратите внимание, что это регулярное выражение позволяет вводить диакритические знаки, буквы и пробелы в любом порядке. Если вам нужно более точное регулярное выражение (например, диакритические знаки разрешены только после базовой буквы), вы можете рассмотреть что-то вроде
String regex = "(?U)\\s*(?>\\p{L}\\p{M}*+)+(?:\\s+(?>\\p{L}\\p{M}*+)+)*\\s*";
Здесь (?>\\p{L}\\p{M}*+)+
соответствует одной или нескольким буквам, за которыми следуют ноль или более диакритических знаков, \s*
соответствует нулю или нескольким пробелам, а \s+
соответствует 1 или более пробелам.
\p{IsAlphabetic}
против [\p{L}\p{M}]
Если вы проверяете исходный код , \p{Alphabetic}
проверяет, истинно ли Character.isAlphabetic(ch)
. Это верно, если символ принадлежит к одному из следующих классов: UPPERCASE_LETTER
, LOWERCASE_LETTER
, TITLECASE_LETTER
, MODIFIER_LETTER
, OTHER_LETTER
, LETTER_NUMBER
или имеет свойство-вкладчик Other_Alphabetic . Это является производным от Lu + Ll + Lt + Lm + Lo + Nl + Other_Alphabetic
.
Хотя все эти L
подклассы образуют общий класс L
, обратите внимание, что Other_Alphabetic
также включает Буквенный номер Nl
и включает в себя больше символов, чем \p{M}
class, см. эту ссылку (хотя это на немецком языке, категории и имена символов на английском).
Итак, \p{IsAlphabetic}
шире, чем [\p{L}\p{M}]
, и вы должны принять правильное решение на основе языков, которые вы хотите поддерживать.