Преобразование CamelCase в удобочитаемый формат в Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для преобразования текста в формате CamelCase в удобочитаемый вид на языке Java, необходимо разделить строку по заглавным буквам (исключая первую), после чего сделать первую букву результата заглавной:

Java
Скопировать код
String camel = "CamelCaseText";
String readable = camel.replaceAll("(?!^)([A-Z])", " $1"); // добавляем пробел перед каждой заглавной буквой
readable = Character.toUpperCase(readable.charAt(0)) + readable.substring(1);// преобразуем первую букву в заглавную

В результате строка "CamelCaseText" преобразуется в "Camel Case Text".

Кинга Идем в IT: пошаговый план для смены профессии

Решение общих проблем преобразования CamelCase

Преобразование CamelCase в удобочитаемый формат может приводить к некоторым трудностям, вот некоторые из них:

  1. Сочетания вместе с числами: Необходимо таким образом адаптировать ваше регулярное выражение, чтобы оно учитывало цифры в CamelCase.
Java
Скопировать код
// Можем ли мы работать с CamelCase и числами одновременно?
String camelWithNumber = "CamelCase2Words"; 
String readable = camelWithNumber.replaceAll("(?!^)([A-Z]|[0-9]+)", " $1"); // мы разделяем строки с числами и заглавные буквы
  1. Сохранение акронимов: Аббревиатуры должны быть сохранены в их исходном регистре.
Java
Скопировать код
// HTTP – это не просто слово, это акроним!
String camelWithAcronym = "HTTPRequest";
String readable = camelWithAcronym.replaceAll("(?!^)([A-Z][a-z])", " $1"); // специально обрабатываем места, где после заглавной буквы идёт строчная
  1. Подчёркивания и специальные символы: В зависимости от требований, они могут быть частью читаемого текста или выполнять роль разделителей.
Java
Скопировать код
// Подчёркивание как герой удобства чтения строк
String camelWithUnderscore = "Complex_Name_Resolver";
String readable = camelWithUnderscore.replaceAll("(_ID$)', ' '").replace('_', ' '); // эффективная обработка подчёркиваний
  1. Качество превосходит скорость: Главный упор следует делать на улучшение читаемости вместо максимизации производительности.

Используйте StringUtils для более глубокого контроля

Подробнее настройте преобразование, используя функции StringUtils.splitByCharacterTypeCamelCase и StringUtils.capitalize из пакета Apache Commons Lang:

Java
Скопировать код
import org.apache.commons.lang3.StringUtils;
// StringUtils облегчит выполнение вашей задачи
String camel = "CamelCaseExample";
String[] words = StringUtils.splitByCharacterTypeCamelCase(camel); // разделяем строку на слова
String readable = StringUtils.join(words, ' '); // объединяем слова в предложение
readable = StringUtils.capitalize(readable); // делаем первую букву заглавной

Эта комбинация функций упрощает процесс разбиения строки на слова и преобразования первой буквы в заглавную.

Используйте инфлектор для обработки сложных случаев

Инфлектор – это отличный инструмент для выполняемых преобразований, учитывающий удобочитаемость. Метод humanize из класса org.modeshape.common.text.Inflector может быть очень полезным:

Java
Скопировать код
import org.modeshape.common.text.Inflector;

Inflector inflector = new Inflector();
String camel = "employee_id";
// Инфлектор не просто преобразовывает строки – он словно обеспечивает им отдых на курорте
String readable = inflector.humanize(camel); // обрабатываются подчёркивания, удаляется "_id" и так далее

Для получения необходимых JAR-файлов используйте Maven-артефакт org.modeshape:modeshape-common и репозиторий JBoss.

Создайте собственный инструмент для работы с CamelCase

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

Java
Скопировать код
public class CamelCaseUtil {

    public static String toHumanReadable(String camelCase) {
        String readable = camelCase.replaceAll(
                String.format("%s|%s|%s",
                        "(?<=[A-Z])(?=[A-Z][a-z])", // переход от одной заглавной буквы к другой, за которой следует строчная
                        "(?<=[^A-Z])(?=[A-Z])", // переход от строчной к заглавной букве
                        "(?<=[A-Za-z])(?=[^A-Za-z])" // переход от буквы к не-букве
                ),
                " "
        );
        // Снова прибегаем к помощи функции StringUtils
        return StringUtils.capitalize(readable.trim()); // добавляем заглавную букву после удаления начальных и конечных пробелов
    }
}

Мы применяем регулярные выражения с позитивными и негативными опережающими утверждениями для точного выделения переходных мест в строке.

Визуализация

Преобразование из формата CamelCase в удобочитаемый формат можно представить как разделение каждого слова на отдельное пространство:

Markdown
Скопировать код
CamelCase:         CustomerServiceManager
Удобочитаемый вид: Customer Service Manager

Визуализируйте это как поток слов, прибывающих на языковую станцию, где каждая заглавная буква является сигналом (🚦) для комфортной остановки слов:

Markdown
Скопировать код
Языковая станция:   🚂== Customer Service Manager
                    🚦

Поезд 🚂 приносит слова, склееные вместе, когда они входят на станцию 🚦, между ними образуются пробелы.

Основывайтесь на тестировании при подходе к задаче

Тестируйте ваш метод в различных ситуациях с использованием JUnit для обеспечения его правильной работы:

Java
Скопировать код
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

public class CamelCaseUtilTest {

    @Test
    public void testToHumanReadable() {
        // Три теста пошли в бар...
        assertEquals("Camel Case Util", CamelCaseUtil.toHumanReadable("CamelCaseUtil")); // И все три теста успешно завершились. Конец шутки.
        assertEquals("Camel Case 123", CamelCaseUtil.toHumanReadable("CamelCase123"));
        assertEquals("HTTP Request", CamelCaseUtil.toHumanReadable("HTTPRequest"));
    }
}

Такое тестирование станет надёжной защитой вашего метода от непредвиденных сценариев в рабочем окружении.

Полезные материалы

  1. WordUtils (Apache Commons Lang 3.11 API)
  2. String (Java Platform SE 7)
  3. CaseFormat (Guava: Google Core Libraries for Java 23.0 API)
  4. java – RegEx to split camelCase or TitleCase (advanced) – Stack Overflow
  5. GitHub – atteo/evo-inflector: Singular to plural English word converter
  6. StringUtils (Apache Commons Lang 3.14.0 API)
  7. JUnit 5 User Guide