Преобразование CamelCase в удобочитаемый формат в Java
Быстрый ответ
Для преобразования текста в формате CamelCase в удобочитаемый вид на языке Java, необходимо разделить строку по заглавным буквам (исключая первую), после чего сделать первую букву результата заглавной:
String camel = "CamelCaseText";
String readable = camel.replaceAll("(?!^)([A-Z])", " $1"); // добавляем пробел перед каждой заглавной буквой
readable = Character.toUpperCase(readable.charAt(0)) + readable.substring(1);// преобразуем первую букву в заглавную
В результате строка "CamelCaseText" преобразуется в "Camel Case Text".
Решение общих проблем преобразования CamelCase
Преобразование CamelCase в удобочитаемый формат может приводить к некоторым трудностям, вот некоторые из них:
- Сочетания вместе с числами: Необходимо таким образом адаптировать ваше регулярное выражение, чтобы оно учитывало цифры в CamelCase.
// Можем ли мы работать с CamelCase и числами одновременно?
String camelWithNumber = "CamelCase2Words";
String readable = camelWithNumber.replaceAll("(?!^)([A-Z]|[0-9]+)", " $1"); // мы разделяем строки с числами и заглавные буквы
- Сохранение акронимов: Аббревиатуры должны быть сохранены в их исходном регистре.
// HTTP – это не просто слово, это акроним!
String camelWithAcronym = "HTTPRequest";
String readable = camelWithAcronym.replaceAll("(?!^)([A-Z][a-z])", " $1"); // специально обрабатываем места, где после заглавной буквы идёт строчная
- Подчёркивания и специальные символы: В зависимости от требований, они могут быть частью читаемого текста или выполнять роль разделителей.
// Подчёркивание как герой удобства чтения строк
String camelWithUnderscore = "Complex_Name_Resolver";
String readable = camelWithUnderscore.replaceAll("(_ID$)', ' '").replace('_', ' '); // эффективная обработка подчёркиваний
- Качество превосходит скорость: Главный упор следует делать на улучшение читаемости вместо максимизации производительности.
Используйте StringUtils для более глубокого контроля
Подробнее настройте преобразование, используя функции StringUtils.splitByCharacterTypeCamelCase
и StringUtils.capitalize
из пакета Apache Commons Lang:
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
может быть очень полезным:
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
Вы можете создать свой метод, идеально отвечающий вашим специфическим потребностям:
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 в удобочитаемый формат можно представить как разделение каждого слова на отдельное пространство:
CamelCase: CustomerServiceManager
Удобочитаемый вид: Customer Service Manager
Визуализируйте это как поток слов, прибывающих на языковую станцию, где каждая заглавная буква является сигналом (🚦) для комфортной остановки слов:
Языковая станция: 🚂== Customer Service Manager
🚦
Поезд 🚂 приносит слова, склееные вместе, когда они входят на станцию 🚦, между ними образуются пробелы.
Основывайтесь на тестировании при подходе к задаче
Тестируйте ваш метод в различных ситуациях с использованием JUnit для обеспечения его правильной работы:
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"));
}
}
Такое тестирование станет надёжной защитой вашего метода от непредвиденных сценариев в рабочем окружении.
Полезные материалы
- WordUtils (Apache Commons Lang 3.11 API)
- String (Java Platform SE 7)
- CaseFormat (Guava: Google Core Libraries for Java 23.0 API)
- java – RegEx to split camelCase or TitleCase (advanced) – Stack Overflow
- GitHub – atteo/evo-inflector: Singular to plural English word converter
- StringUtils (Apache Commons Lang 3.14.0 API)
- JUnit 5 User Guide