1. 概要

簡単に言えば、Apache Commons Textライブラリには、コアJavaが提供するもの以外にも、Stringsを操作するための便利なユーティリティメソッドが多数含まれています。

この簡単な紹介では、Apache Commons Textとは何か、それが何に使用されるか、およびライブラリーの実際の使用例をいくつか見ていきます。

2. Mavenの依存関係

次のMaven依存関係をpom.xmlに追加することから始めましょう。

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

ライブラリの最新バージョンは、 Maven CentralRepositoryにあります。

3. 概要

ルートパッケージorg.apache.commons.textは、さまざまなサブパッケージに分割されています。

  • org.apache.commons.text.diff 文字列間の差分
  • org.apache.commons.text.similarity 文字列間の類似性と距離
  • org.apache.commons.text.translate –テキストの翻訳

各パッケージの用途を詳しく見ていきましょう。

3. テキストの処理

org.apache.commons.text パッケージには、Stringsを操作するための複数のツールが含まれています。

たとえば、 WordUtils には、 String、の各単語の最初の文字を大文字にして、 String、の大文字と小文字を入れ替え、[X176X ] String には、指定された配列内のすべての単語が含まれます。

String:の各単語の最初の文字を大文字にする方法を見てみましょう。

@Test
public void whenCapitalized_thenCorrect() {
    String toBeCapitalized = "to be capitalized!";
    String result = WordUtils.capitalize(toBeCapitalized);
    
    assertEquals("To Be Capitalized!", result);
}

文字列に配列内のすべての単語が含まれているかどうかを確認する方法は次のとおりです。

@Test
public void whenContainsWords_thenCorrect() {
    boolean containsWords = WordUtils
      .containsAllWords("String to search", "to", "search");
    
    assertTrue(containsWords);
}

StrSubstitutor は、テンプレートからStringsを構築するための便利な方法を提供します。

@Test
public void whenSubstituted_thenCorrect() {
    Map<String, String> substitutes = new HashMap<>();
    substitutes.put("name", "John");
    substitutes.put("college", "University of Stanford");
    String templateString = "My name is ${name} and I am a student at the ${college}.";
    StrSubstitutor sub = new StrSubstitutor(substitutes);
    String result = sub.replace(templateString);
    
    assertEquals("My name is John and I am a student at the University of Stanford.", result);
}

StrBuilder は、Java.lang.StringBuilderの代替です。 StringBuilderでは提供されないいくつかの新機能を提供します。

たとえば、 Stringのすべての出現箇所を別のStringに置き換えたり、Stringをその参照に新しいオブジェクトを割り当てずにクリアしたりできます。

文字列の一部を置き換える簡単な例を次に示します:

@Test
public void whenReplaced_thenCorrect() {
    StrBuilder strBuilder = new StrBuilder("example StrBuilder!");
    strBuilder.replaceAll("example", "new");
   
    assertEquals(new StrBuilder("new StrBuilder!"), strBuilder);
}

String、をクリアするには、ビルダーで clear()メソッドを呼び出すだけです。

strBuilder.clear();

4. 文字列間の差分の計算

パッケージorg.apache.commons.text.diffは、2つの文字列間の差分を計算するためのMyersアルゴリズムを実装しています。

2つのStrings間の差分は、1つのStringを別のStringに変換できる一連の変更によって定義されます。

String を別のコマンドに変換するために使用できるコマンドには、 InsertCommand KeepCommand 、およびDeleteCommandの3種類があります。

EditScript オブジェクトは、Stringを別の文字列に変換するために実行する必要のあるスクリプトを保持します。 Stringを別の文字列に変換するために行う必要のある単一文字の変更の数を計算してみましょう。

@Test
public void whenEditScript_thenCorrect() {
    StringsComparator cmp = new StringsComparator("ABCFGH", "BCDEFG");
    EditScript<Character> script = cmp.getScript();
    int mod = script.getModifications();
    
    assertEquals(4, mod);
}

5. 文字列間の類似点と距離

org.apache.commons.text.similarity パッケージには、文字列間の類似性と距離を見つけるのに役立つアルゴリズムが含まれています。

たとえば、 LongestCommonSubsequence を使用して、2つの文字列の共通文字の数を見つけることができます。

@Test
public void whenCompare_thenCorrect() {
    LongestCommonSubsequence lcs = new LongestCommonSubsequence();
    int countLcs = lcs.apply("New York", "New Hampshire");
    
    assertEquals(5, countLcs);
}

同様に、 LongestCommonSubsequenceDistance を使用して、2つの文字列内の異なる文字の数を見つけることができます。

@Test
public void whenCalculateDistance_thenCorrect() {
    LongestCommonSubsequenceDistance lcsd = new LongestCommonSubsequenceDistance();
    int countLcsd = lcsd.apply("New York", "New Hampshire");
    
    assertEquals(11, countLcsd);
}

6. テキスト翻訳

org.apache.text.translate パッケージは、StringEscapeUtilsによって提供されるルールをカスタマイズできるようにするために最初に作成されました。

パッケージには、テキストをUnicodeや数値文字参照などのさまざまな文字エンコードモデルに変換する一連のクラスが含まれています。 翻訳用に独自にカスタマイズしたルーチンを作成することもできます。

Stringを同等のUnicodeテキストに変換する方法を見てみましょう。

@Test
public void whenTranslate_thenCorrect() {
    UnicodeEscaper ue = UnicodeEscaper.above(0);
    String result = ue.translate("ABCD");
    
    assertEquals("\\u0041\\u0042\\u0043\\u0044", result);
}

ここでは、変換を開始する文字のインデックスを above()メソッドに渡します。

LookupTranslator を使用すると、各文字が対応する値を持つことができる独自のルックアップテーブルを定義でき、任意のテキストを対応する同等のテキストに変換できます。

7. 結論

このクイックチュートリアルでは、ApacheCommonsTextの概要とその一般的な機能のいくつかを見てきました。

コードサンプルはGitHubにあります。