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

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

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

1. Обзор

Camel case и title case обычно используются в качестве идентификаторов для полей и типов. Мы можем захотеть преобразовать текст в этот формат.

Этого можно добиться либо написанием собственного кода, либо использованием сторонних библиотек.

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

2. Java-решения

Случай Camel позволяет нам соединять несколько слов, удаляя пробелы и используя заглавные буквы для обозначения границ слов. ``

Есть два типа:

  • Нижний верблюжий регистр, где первый символ первого слова написан строчными буквами.
  • Верблюжий регистр в верхнем регистре, также известный как заглавный регистр, где первый символ первого слова написан прописными буквами:
thisIsLowerCamelCase
ThisIsLowerCamelCase

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

2.1. Регулярное выражение (регулярное выражение)

Мы можем использовать регулярные выражения , чтобы разделить нашу строку, содержащую слова, на массив:

String[] words = text.split("[\\W_]+");

Это разбивает данную строку на любой символ, который не является частью слова. Подчеркивание обычно считается символом слова в регулярных выражениях. Случай Camel не включает подчеркивание, поэтому мы добавили его в выражение-разделитель.

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

StringBuilder builder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
String word = words[i];
if (i == 0) {
word = word.isEmpty() ? word : word.toLowerCase();
} else {
word = word.isEmpty() ? word : Character.toUpperCase(word.charAt(0)) + word.substring(1).toLowerCase();
}
builder.append(word);
}
return builder.toString();

Здесь мы преобразуем первую строку/слово в массиве в нижний регистр. Для каждого второго слова в массиве мы преобразуем первый символ в верхний регистр, а остальные — в нижний.

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

assertThat(toCamelCaseByRegex("THIS STRING SHOULD BE IN CAMEL CASE"))
.isEqualTo("thisStringShouldBeInCamelCase");

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

2.2. Итерация по строке

Мы могли бы заменить приведенный выше алгоритм циклом, который определяет правильный регистр каждого символа, когда он проходит через исходную строку. Это пропускает любые разделители и записывает по одному символу в StringBuilder .

Во-первых, нам нужно отслеживать состояние конверсии:

boolean shouldConvertNextCharToLower = true;

Затем мы перебираем исходный текст, пропуская или соответствующим образом используя заглавные буквы:

for (int i = 0; i < text.length(); i++) {
char currentChar = text.charAt(i);
if (currentChar == delimiter) {
shouldConvertNextCharToLower = false;
} else if (shouldConvertNextCharToLower) {
builder.append(Character.toLowerCase(currentChar));
} else {
builder.append(Character.toUpperCase(currentChar));
shouldConvertNextCharToLower = true;
}
}
return builder.toString();

Символ-разделитель здесь представляет собой символ , представляющий ожидаемый символ, не являющийся словом.

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

assertThat(toCamelCaseByIteration("THIS STRING SHOULD BE IN CAMEL CASE", ' '))
.isEqualTo("thisStringShouldBeInCamelCase");

Мы также можем попробовать это с разделителем подчеркивания:

assertThat(toCamelCaseByIteration("THIS_STRING_SHOULD_BE_IN_CAMEL_CASE", '_'))
.isEqualTo("thisStringShouldBeInCamelCase");

3. Использование сторонних библиотек

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

3.1. Текст Apache Commons

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

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version>
</dependency>

Эта библиотека предоставляет метод toCamelCase в CaseUtils :

String camelCase = CaseUtils.toCamelCase(text, false, delimiter);

Давайте попробуем:

assertThat(CaseUtils.toCamelCase("THIS STRING SHOULD BE IN CAMEL CASE", false, ' '))
.isEqualTo("thisStringShouldBeInCamelCase");

Чтобы преобразовать строку в заглавный или верхний верблюжий регистр, нам нужно передать true в метод toCamelCase :

String camelCase = CaseUtils.toCamelCase(text, true, delimiter);

Давайте попробуем:

assertThat(CaseUtils.toCamelCase("THIS STRING SHOULD BE IN CAMEL CASE", true, ' '))
.isEqualTo("ThisStringShouldBeInCamelCase");

3.2. Гуава

С небольшой предварительной обработкой мы можем преобразовать строку в верблюжью через Guava .

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

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>

В Guava есть служебный класс CaseFormat для преобразования формата:

String camelCase = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "THIS_STRING_SHOULD_BE_IN_CAMEL_CASE");

Это преобразует заданную строку верхнего регистра, разделенную символом подчеркивания, в нижний регистр верблюда. Давай увидим это:

assertThat(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "THIS_STRING_SHOULD_BE_IN_CAMEL_CASE"))
.isEqualTo("thisStringShouldBeInCamelCase");

Это нормально, если наша строка уже имеет этот формат. Однако, если мы хотим использовать другой разделитель и обрабатывать смешанные случаи, нам нужно предварительно обработать наш ввод:

String toUpperUnderscore = "This string should Be in camel Case"
.toUpperCase()
.replaceAll(' ', "_");

Сначала мы преобразуем данную строку в верхний регистр. Затем мы заменяем все разделители символами подчеркивания. Полученный формат эквивалентен CaseFormat.UPPER_UNDERSCORE в Guava. Теперь мы можем использовать Guava для создания версии с верблюжьим корпусом:

assertThat(toCamelCaseUsingGuava("THIS STRING SHOULD BE IN CAMEL CASE", " "))
.isEqualTo("thisStringShouldBeInCamelCase");

4. Вывод

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

Во-первых, мы построили алгоритм для разбиения строки на слова. Затем мы построили алгоритм, который перебирал каждый символ.

Наконец, мы рассмотрели, как использовать некоторые сторонние библиотеки для достижения результата. Apache Commons Text был близок к этому, и Guava могла нам помочь после некоторой предварительной обработки.

Как обычно, полный исходный код доступен на GitHub .