1. 序章

文字列の分割は非常に一般的な作業であることは誰もが知っています。 ただし、多くの場合、1つの区切り文字だけを使用して分割します。

このチュートリアルでは、複数の区切り文字で文字列を分割するためのさまざまなオプションについて詳しく説明します。

2. Java文字列を複数の区切り文字で分割する

以下の各ソリューションがどのように分割を実行するかを示すために、同じサンプル文字列を使用します。

String example = "Mary;Thomas:Jane-Kate";
String[] expectedArray = new String[]{"Mary", "Thomas", "Jane", "Kate"};

2.1. 正規表現ソリューション

プログラマーは、文字列の検索パターンを定義するために、さまざまな正規表現を使用することがよくあります。 また、文字列を分割する場合にも非常に人気のあるソリューションです。 それでは、Javaで正規表現を使用して文字列を複数の区切り文字で分割する方法を見てみましょう。

まず、正規表現がで利用できるため、新しい依存関係を追加する必要はありません。 java .util.regex パッケージ 。 分割する入力文字列とパターンを定義するだけです。

次のステップは、パターンを適用することです。 パターンは0回または複数回一致する可能性があります。 異なる区切り文字で分割するには、パターン内のすべての文字を設定する必要があります。

このアプローチを実証するための簡単なテストを作成します。

String[] names = example.split("[;:-]");
Assertions.assertEquals(4, names.length);
Assertions.assertArrayEquals(expectedArray, names);

パターン内の文字で分割する必要がある名前のテスト文字列を定義しました。 パターン自体には、セミコロン、コロン、およびハイフンが含まれています。 サンプルの文字列に適用すると、配列に4つの名前が含まれます。

2.2. グアバソリューション

Guava は、文字列を複数の区切り文字で分割するためのソリューションも提供します。 そのソリューションは、スプリッタークラスに基づいています。 このクラスは、セパレータシーケンスを使用して、入力文字列からサブ文字列を抽出します。 このシーケンスは複数の方法で定義できます。

  • 単一のキャラクターとして
  • 固定文字列
  • 正規表現
  • CharMatcherインスタンス

さらに、 Splitter クラスには、区切り文字を定義するための2つのメソッドがあります。 それでは、両方をテストしてみましょう。

まず、Guava依存関係を追加します。

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

次に、onメソッドから始めます。publicstatic Splitter on(Pattern SepatorPattern)

分割の区切り文字を定義するためのパターンを取ります。 まず、区切り文字の組み合わせを定義し、パターンをコンパイルします。 その後、文字列を分割できます。

この例では、正規表現を使用して区切り文字を指定します。

Iterable<String> names = Splitter.on(Pattern.compile("[;:-]")).split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

もう1つのメソッドは、onPatternメソッドです。

このメソッドと前のメソッドの違いは、onPatternメソッドがパターンを文字列として受け取ることです。 onメソッドのようにコンパイルする必要はありません。 onPatternメソッドをテストするための区切り文字の同じ組み合わせを定義します。

Iterable<String> names = Splitter.onPattern("[;:-]").split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

どちらのテストでも、文字列を分割して4つの名前の配列を取得することができました。

入力文字列を複数の区切り文字で分割しているため、CharMatcherクラスでanyOfメソッドを使用することもできます。

Iterable<String> names = Splitter.on(CharMatcher.anyOf(";:-")).split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

このオプションは、Splitterクラスのonメソッドにのみ付属しています。 結果は前の2つのテストと同じです。

2.3. ApacheCommonsソリューション

ここで説明する最後のオプションは、Apache CommonsLang3ライブラリで利用できます。

まず、 Apache CommonsLang依存関係をpom.xmlファイルに追加します。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

次に、StringUtilsクラスのsplitメソッドを使用します。

String[] names = StringUtils.split(example, ";:-");
Assertions.assertEquals(4, names.length);
Assertions.assertArrayEquals(expectedArray, names);

文字列を分割するために使用するすべての文字を定義するだけで済みます。 split メソッドを呼び出すと、example文字列が4つの名前に分割されます。

3. 結論

この記事では、入力文字列を複数の区切り文字で分割するためのさまざまなオプションについて説明しました。 まず、正規表現とプレーンJavaに基づくソリューションについて説明しました。 後で、グアバで利用可能なさまざまなオプションを示しました。 最後に、Apache CommonsLang3ライブラリに基づくソリューションで例をまとめました。

いつものように、これらの例のコードはGitHubから入手できます。