null

Как сделать первый символ каждого слова в строке заглавной буквой

В этой статье приведен пример как сделать первый символ каждого слова в строке заглавной буквой. 

Представим ситуацию: ФИО пользователей поступают в программу в свободной форме. Для эффективной дальнейшей работы с данными необходимо эти данные нормализировать.

Примеры поступающих данных:

Пример входящих данных: 
пупкин василий васильевич
ПУТИН ВЛАДИМИР ВЛАДИМИРОВИЧ
иванов-петров Иван Петрович
лУПКИН пУПА
д'анжело Жоржетта 
О.генри

Как показывают представленные данные, недостаточно просто изменить регистр каждой буквы после пробела. В таком случае мы не сможем обрабатывать имена и фамилии, записанные с использованием специальных символов, таких как дефис ‘-’ и тире ‘—’ в двойных фамилиях, символы апострофа ‘`’ и точки ‘.’. Возможно, это не все необычные символы, которые можно добавить в имя и фамилию.

Для решения этой задачи напишем такую функцию: 

   private fun upperCaseAllFirstCharacter(text: String): String {
        val regex = "\\b(.)(.*?)\\b";
        return Pattern.compile(regex).matcher(text.lowercase()).replaceAll {
            it.group(1).uppercase() + it.group(2)
        }
    }

Что здесь происходит: 

Создается переменная regex, которая содержит регулярное выражение "\\b(.)(.*?)\\b". Регулярное выражение используется для поиска слов в строке.

   - \\b - обозначает границу слова.
   - (.) - захватывает первый символ слова в группу.
   - (.*?) - захватывает остальные символы слова (любое количество символов) во вторую группу.
   - \\b - обозначает границу слова.


Вызывается метод, matcher, который меняет регистр выражения в нижний.  Метод replaceAll заменяет все найденные соответствия в строке согласно логике, определенной в переданном лямбда-выражении { it.group(1).uppercase() + it.group(2) }..

В этом выражении:
   - it.group(1) - обращается к первой захваченной группе (первому символу слова).
   - it.group(2) - обращается ко второй захваченной группе (остальным символам слова).
   - it.group(1).uppercase() + it.group(2) - объединяет первую группу (первый символ) в верхнем регистре с второй группой (остальные символы).

Таким образом, вызов функции upperCaseAllFirstCharacter с передачей строки text возвращает новую строку, где все первые символы каждого слова преобразованы в верхний регистр.

Что мы получим на выходе для вводных данных из начала статьи:

Пупкин Василий Васильевич
Путин Владимир Владимирович
Иванов-Петров Иван Петрович
Лупкин Пупа
Д'Анжело Жоржетта 
О.Генри