Какие методы есть для проверки символа на букву в Kotlin
Что проверяют
Знаете ли вы стандартную библиотеку Kotlin и понимаете ли, что «буква» определяется по Unicode, а не только по латинице. Следом часто просят проверить целую строку или объяснить, почему регулярка и isLetter() расходятся на кириллице.
Как отвечать
Основной способ один, остальные для частных случаев:
Char.isLetter(): расширение изkotlin.text, работает по Unicode. Вернётtrueдля'A','я','é'и иероглифов,falseдля цифр, пробелов и знаков;- соседние проверки:
isDigit(),isLetterOrDigit(),isWhitespace(),isUpperCase(),isLowerCase(); Char.category: возвращаетCharCategory, напримерUPPERCASE_LETTER,LOWERCASE_LETTER,OTHER_LETTER. Нужна, когда важна конкретная категория, а не любая буква;- диапазоны:
c in 'a'..'z' || c in 'A'..'Z', когда по бизнес-правилу допустима только латиница, например в логине; - регулярные выражения:
\p{L}для любой буквы или[a-zA-Z]для латиницы. Уместны, когда проверяется шаблон строки целиком.
Для строки пишут name.all { it.isLetter() } или any, если нужна хотя бы одна буква. Регулярку компилируют один раз и держат в поле или companion object, а не создают на каждый вызов.
Плюс к ответу, если вспомните суррогатные пары. Char в Kotlin это одна кодовая единица UTF-16, и символы вне базовой плоскости Unicode занимают два Char. Для них проверяют кодовую точку: Character.isLetter(text.codePointAt(i)).
Где спотыкаются
Проверяют через [A-Za-z] и считают, что это то же самое, что isLetter(). Для кириллицы результат разный, и форма регистрации начинает отклонять русские имена.
Сравнивают Character.getType() только с заглавными и строчными буквами. Китайские, японские и арабские буквы относятся к категории OTHER_LETTER и в такую проверку не попадают.
Забывают, что all на пустой строке возвращает true. Пустое имя пройдёт проверку «только буквы», если длину не проверить отдельно.