Перейти к основному содержимому

Преобразование строки в регистр заголовков

· 4 мин. чтения

1. Введение

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

Мы покажем различные способы реализации пользовательского метода, а также покажем, как это сделать с помощью сторонних библиотек.

2. Основные решения Java

2.1. Перебор строковых символов

Один из способов преобразовать String в заглавный регистр — перебрать все символы String .

Для этого, когда мы находим разделитель слов, мы делаем следующий символ заглавным. После этого мы меняем остальные символы на нижний регистр, пока не дойдем до следующего разделителя слов.

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

public static String convertToTitleCaseIteratingChars(String text) {
if (text == null || text.isEmpty()) {
return text;
}

StringBuilder converted = new StringBuilder();

boolean convertNext = true;
for (char ch : text.toCharArray()) {
if (Character.isSpaceChar(ch)) {
convertNext = true;
} else if (convertNext) {
ch = Character.toTitleCase(ch);
convertNext = false;
} else {
ch = Character.toLowerCase(ch);
}
converted.append(ch);
}

return converted.toString();
}

Как мы видим, мы используем метод Character.toTitleCase для преобразования, так как он проверяет регистр символов, эквивалентный символу в Unicode.

Если мы протестируем этот метод, используя эти входные данные:

tHis IS a tiTLe
tHis, IS a tiTLe

Мы получаем следующие ожидаемые результаты:

This Is A Title
This, Is A Title

2.2. Разделение на слова

Другой способ сделать это — разбить строку на слова, преобразовать каждое слово в заглавный регистр и, наконец, снова соединить все слова, используя тот же разделитель слов.

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

private static final String WORD_SEPARATOR = " ";

public static String convertToTitleCaseSplitting(String text) {
if (text == null || text.isEmpty()) {
return text;
}

return Arrays
.stream(text.split(WORD_SEPARATOR))
.map(word -> word.isEmpty()
? word
: Character.toTitleCase(word.charAt(0)) + word
.substring(1)
.toLowerCase())
.collect(Collectors.joining(WORD_SEPARATOR));
}

Используя те же входные данные, что и раньше, мы получаем точно такие же выходные данные:

This Is A Title
This, Is A Title

3. Использование Apache Commons

Если мы не хотим реализовывать собственный пользовательский метод, мы можем использовать библиотеку Apache Commons. Настройка этой библиотеки описана в этой статье .

Это предоставляет класс WordUtils , который имеет метод capitalizeFully () , который делает именно то, чего мы хотим достичь:

public static String convertToTileCaseWordUtilsFull(String text) {
return WordUtils.capitalizeFully(text);
}

Как мы видим, это очень просто в использовании, и если мы протестируем его с теми же входными данными, что и раньше, мы получим те же результаты:

This Is A Title
This, Is A Title

Кроме того, класс WordUtils предоставляет еще один метод capitalize() , который работает так же, как и capitalizeFully(), за исключением того, что он изменяет только первый символ каждого слова . Это означает, что он не преобразует остальные символы в нижний регистр.

Давайте посмотрим, как мы можем это использовать:

public static String convertToTileCaseWordUtils(String text) {
return WordUtils.capitalize(text);
}

Теперь, если мы проверим его с теми же входными данными, что и раньше, мы получим эти разные выходные данные:

THis IS A TiTLe
THis, IS A TiTLe

4. Использование ICU4J

Другая библиотека, которую мы можем использовать, — это ICU4J, которая обеспечивает поддержку Unicode и глобализации.

Чтобы использовать его, нам нужно добавить эту зависимость в наш проект:

<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>61.1</version>
</dependency>

Последнюю версию можно найти здесь .

Эта библиотека работает очень похоже на WordUtils , но мы можем указать BreakIterator , чтобы сообщить методу, как мы хотим разбить String и, следовательно, какие слова мы хотим преобразовать в заглавный регистр:

public static String convertToTitleCaseIcu4j(String text) {
if (text == null || text.isEmpty()) {
return text;
}

return UCharacter.toTitleCase(text, BreakIterator.getTitleInstance());
}

Как мы видим, у них есть специальный BreakIterator для работы с заголовками. Если мы не указываем BreakIterator , он использует значения по умолчанию из Unicode , которые в этом случае генерируют те же результаты.

Кроме того, обратите внимание, что этот метод позволяет нам указать локаль строки , которую мы преобразуем, чтобы выполнить преобразование, зависящее от локали .

5. Вывод

В этой краткой статье мы показали, как преобразовать строку в формат заглавного регистра в Java. Сначала мы использовали наши собственные реализации, а затем показали, как это сделать с помощью внешних библиотек.

Как всегда, полный исходный код примеров доступен на GitHub .