1. 概要

このチュートリアルでは、Javaのn文字ごとに文字列を分割する方法を説明します。

まず、組み込みのJavaメソッドを使用してこれを行うための可能な方法を探ることから始めます。 次に、Guavaを使用して同じ目的を達成する方法を紹介します。

2. String#splitメソッドの使用

Theクラスには、という便利なメソッドが付属していますスプリット。 名前が示すように 指定された区切り文字または正規表現に基づいて、文字列を複数の部分に分割します。

実際の動作を見てみましょう。

public static List<String> usingSplitMethod(String text, int n) {
    String[] results = text.split("(?<=\\G.{" + n + "})");

    return Arrays.asList(results);
}

ご覧のとおり、正規表現を使用しました (?<= \\ G。{” + n +“}) どこ n 文字数です。 これは、ポジティブルックビハインドアサーションであり、最後に一致する文字列(\ G)の後にn文字が続く文字列に一致します。

それでは、すべてが期待どおりに機能することを確認するためのテストケースを作成しましょう。

public class SplitStringEveryNthCharUnitTest {

    public static final String TEXT = "abcdefgh123456";

    @Test
    public void givenString_whenUsingSplit_thenSplit() {
        List<String> results = SplitStringEveryNthChar.usingSplitMethod(TEXT, 3);

        assertThat(results, contains("abc", "def", "gh1", "234", "56"));
    }
}

3. String#substringメソッドの使用

String オブジェクトをn番目の文字ごとに分割する別の方法は、substringメソッドを使用することです。

基本的に、文字列をループして substring を呼び出し、指定されたn文字に基づいて複数の部分に分割できます。

public static List<String> usingSubstringMethod(String text, int n) {
    List<String> results = new ArrayList<>();
    int length = text.length();

    for (int i = 0; i < length; i += n) {
        results.add(text.substring(i, Math.min(length, i + n)));
    }

    return results;
}

上に示したように、 substring メソッドを使用すると、現在のインデックスii+nの間の文字列の一部を取得できます。

それでは、テストケースを使用してこれを確認しましょう。

@Test
public void givenString_whenUsingSubstring_thenSplit() {
    List<String> results = SplitStringEveryNthChar.usingSubstringMethod(TEXT, 4);

    assertThat(results, contains("abcd", "efgh", "1234", "56"));
}

4. パターンクラスの使用

Pattern は、正規表現をコンパイルして、指定された文字列と照合するための簡潔な方法を提供します。

したがって、正しい正規表現を使用すると、パターンを使用して目標を達成できます。

public static List<String> usingPattern(String text, int n) {
    return Pattern.compile(".{1," + n + "}")
        .matcher(text)
        .results()
        .map(MatchResult::group)
        .collect(Collectors.toList());
}

ご覧のとおり、 「。{1、n}」 私たちを作成するための正規表現としてパターン物体少なくとも1文字、最大n文字に一致します。

最後に、簡単なテストを書いてみましょう。

@Test
public void givenString_whenUsingPattern_thenSplit() {
    List<String> results = SplitStringEveryNthChar.usingPattern(TEXT, 5);

    assertThat(results, contains("abcde", "fgh12", "3456"));
}

5. グアバの使用

コアJavaメソッドを使用してn文字ごとに文字列を分割する方法がわかったので、Guavaライブラリを使用して同じことを行う方法を見てみましょう。

public static List<String> usingGuava(String text, int n) {
    Iterable<String> parts = Splitter.fixedLength(n).split(text);

    return ImmutableList.copyOf(parts);
}

Guavaは、 Splitter クラスを提供して、文字列からサブ文字列を抽出するロジックを簡素化します。 fixedLength()メソッドは、指定された文字列を指定された長さの断片に分割します。

テストケースを使用してメソッドを検証しましょう。

@Test
public void givenString_whenUsingGuava_thenSplit() {
    List<String> results = SplitStringEveryNthChar.usingGuava(TEXT, 6);

    assertThat(results, contains("abcdef", "gh1234", "56"));
}

6. 結論

要約すると、Javaメソッドを使用してn番目ごとの文字で文字列を分割する方法を説明しました。

その後、Guavaライブラリを使用して同じ目標を達成する方法を示しました。

いつものように、この記事で使用されているコードは、GitHubにあります。