將字符串轉換為駝峰式大小寫

1. 概述

Camel case 和 title case 通常用作字段和類型的標識符。我們可能希望將文本轉換成這種格式。

這可以通過編寫自定義代碼或使用第三方庫來實現。

在本教程中,我們將研究如何編寫一些自定義字符串轉換為駝峰式大小寫,並且我們將探索一些可以幫助我們完成該任務的第三方庫功能。

2. Java 解決方案

Camel case 允許我們通過刪除空格並使用大寫字母來顯示單詞邊界來連接多個單詞。

有兩種類型:

  • 駝峰小寫,第一個單詞的第一個字符是小寫
  • 駝峰大寫,也稱為標題大寫,其中第一個單詞的第一個字符是大寫的:
thisIsLowerCamelCase
 ThisIsLowerCamelCase

在本教程中,我們將專注於轉換為小駝峰格式,儘管這些技術很容易適應兩者。

2.1.正則表達式 (Regex)

我們可以使用正則表達式將包含單詞的字符串拆分為數組:

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();

這裡的分隔符是一個char ,表示預期的非單詞字符。

讓我們嘗試使用空格作為分隔符的解決方案:

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 公共文本

要使用 Apache Commons Text,我們需要將其添加到我們的項目中:

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

這個庫在CaseUtils提供了一個toCamelCase方法:

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>28.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(' ', "_");

首先,我們將給定的字符串轉換為大寫。然後,我們用下劃線替換所有分隔符。結果格式相當於 Guava 的CaseFormat.UPPER_UNDERSCORE.現在我們可以使用 Guava 來製作駝峰版本:

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

4.結論

在本教程中,我們學習瞭如何將字符串轉換為駝峰式大小寫。

首先,我們構建了一個算法來將字符串拆分為單詞。然後我們構建了一個算法來迭代每個字符。

最後,我們研究瞭如何使用一些第三方庫來實現結果。 Apache Commons Text 非常匹配,經過一些預處理後,Guava 可以幫助我們。