1. 概要

キャメルケースとタイトルケースは、フィールドとタイプの識別子として一般的に使用されます。 テキストをこの形式に変換したい場合があります。

これは、カスタムコードを作成するか、サードパーティのライブラリを利用することで実現できます。

このチュートリアルでは、キャメルケースへのカスタム文字列変換を作成する方法を確認し、そのタスクに役立つサードパーティのライブラリ機能をいくつか紹介します。

2. Javaソリューション

キャメルの場合、空白を削除し、大文字を使用して単語の境界を表示することにより、複数の単語を結合できます。

2つのタイプがあります:

  • 最初の単語の最初の文字が小文字である小文字のキャメルケース
  • 大文字のキャメルケース。タイトルケースとも呼ばれ、最初の単語の最初の文字が大文字になります。
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. 文字列を反復処理

上記のアルゴリズムを、元の文字列を通過するときに各文字の正しい大文字と小文字を区別するループに置き換えることができます。 これにより、区切り文字がスキップされ、一度に1文字が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. ApacheCommonsテキスト

Apache Commons Text を使用するには、プロジェクトに追加する必要があります。

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

このライブラリは、CaseUtilstoCamelCaseメソッドを提供します。

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

試してみましょう:

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

文字列をタイトルケースまたは大文字のキャメルケースに変換するには、truetoCamelCaseメソッドに渡す必要があります。

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

まず、指定された文字列を大文字に変換します。 次に、すべての区切り文字をアンダースコアに置き換えます。 結果の形式は、Guavaの形式と同等です。 CaseFormat.UPPER_UNDERSCORE。 これで、Guavaを使用してキャメルケースバージョンを作成できます。

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

4. 結論

このチュートリアルでは、文字列をキャメルケースに変換する方法を学びました。

まず、文字列を単語に分割するアルゴリズムを構築しました。 次に、各文字を反復処理するアルゴリズムを構築しました。

最後に、いくつかのサードパーティライブラリを使用して結果を達成する方法を確認しました。 Apache Commons Textは非常によく一致しており、Guavaはいくつかの前処理の後で私たちを助けることができました。

いつものように、完全なソースコードはGitHubから入手できます。