Javaについて徹底解説!

splitでJavaの文字列を分割しよう! 良く使うサンプル付き!

大石 英人

開発エンジニア/Java20年/Java GOLD/リーダー/ボールド歴2年

Stringのsplitは、文字列を指定した区切り文字列で分割して、Stringの配列とするメソッドです。ポイントは、区切り文字列を「正規表現」と呼ばれるパターンで指定できるという所です。

この記事では、そんなsplitの使い方と応用例をお伝えします。見た目は単純な機能のメソッドですが、意外に使い出のあるメソッドですよ!!

※この記事のサンプルは、Java 10の環境で動作確認しています。


1.String.split(String)は正規表現で文字列を分割する

Stringのsplit(String)は、文字列を引数で指定した区切り文字の正規表現にマッチする部分で分割したString配列を戻します。

区切り文字の間に文字を含まない部分がある場合は(下記例での,,)、その部分は長さ0の文字列となります(nullではありません)

String str = "A,BC,,D";
String[] split = str.split(",");
System.out.println(Arrays.toString(split)); // → ["A", "BC", "", "D"]
System.out.println(split .length); // → 4

文字列が区切り文字を含まない場合は、文字列がそのまま設定された、長さ1String配列が戻ります。

String str = "A,BC,,D";
String[] split = str.split("あ");
System.out.println(Arrays.toString(split)); // → ["A,BC,,D"] ※配列のインデックス0にそのまま入っている
System.out.println(split.length); // → 1

正規表現がよくわからない場合でも、基本的には区切り文字列をそのまま指定してもらって構いません。動作がおかしい場合は、後述する「正規表現で特別な意味を持つ文字」を含めていないか確認してみてください。

1-1.正規表現で気を付けたい文字

splitでの区切り文字は、正規表現だということに注意しましょう。正規表現では特別な意味を持つ文字がいくつかあるので、パッと見どおりに動かないことがあります。

正規表現で気を付けたい文字は、概ね以下のものです。文脈によって意味があったりなかったりします。

[]-.+*?()|^$

例えば、“.”は正規表現だと「何かの1文字」を意味します。“.”そのものを区切り文字にしたい場合は、\でエスケープして正規表現としての意味を打ち消すか、java.util.regex.Patternquoteなどを使いましょう。

String str = "A.BC..D";
String[] split1 = str.split(".");
String[] split2 = str.split("\\.");
String[] split4 = str.split(Pattern.quote("."));
String[] split3 = str.split("[.]");
System.out.println(Arrays.toString(split1)); // → [] ※長さ0の文字列
System.out.println(Arrays.toString(split2)); // → ["A", "BC", "", "D"]
System.out.println(Arrays.toString(split3)); // → 同上
System.out.println(Arrays.toString(split4)); // → 同上

2.String.split(String, int)は分割する数を制限する

splitには、二番目にintの引数を持つメソッドもあります。このintは、分割する数を制限するのに使い、負の数値、0、正の数値で意味が違ってきます。

負の数字を指定すると、全ての区切り文字で分割した結果となります。中身が空でも、全ての要素を取得したい場合に使います。

String str = "A,B,C,,,";
String[] split = str.split(",", -1);
System.out.println(Arrays.toString(split)); // → ["A", "B", "C", "", "", ""]
System.out.println(split.length); // → 6

0を指定すると、分割結果の後ろ部分で、値を持たない部分が省略されます。値が空の部分はいらない場合に使います。split(String)はこの動きです。

String str = "A,B,C,,,";
String[] split = str.split(",", 0);
System.out.println(Arrays.toString(split)); // → ["A", "B", "C"]
System.out.println(split.length); // → 3

正の数値を指定すると、先頭から指定した数だけ分割します。残りの部分は区切り文字が入ったままになります。一部分だけ分割したい場合に便利です。

String str = "A,B,C,,,";

String[] split1 = str.split(",", 1);
System.out.println(Arrays.toString(split1)); // → ["A,B,C,,,"]
System.out.println(split1.length); // → 1

String[] split2 = str.split(",", 2);
System.out.println(Arrays.toString(split2)); // → ["A", "B,C,,,"]
System.out.println(split2.length); // → 2

String[] split3 = str.split(",", 3);
System.out.println(Arrays.toString(split3)); // → ["A", "B", "C,,,"]
System.out.println(split3.length); // → 3

3.【応用】splitの使い方の例

3-1.複数の区切り文字で分割する

今までの例では区切り文字を一つだけ使っていました。ですが、区切り文字は正規表現ですので複数の文字を使えます。以下の例では、“=”“,”の二つを指定しています。文字列の書式が固定であれば、なかなか便利に使えますよ。

String str = "KEY=VALUE1,VALUE2,VALUE3";
String[] split = str.split("[=,]");
System.out.println(Arrays.toString(split)); // → ["KEY", "VALUE1", "VALUE2", "VALUE3"]
System.out.println(split.length); // → 4

3-2.複数の空白を一つとして分割する

複数の空白を一つとして分割することも簡単です。正規表現の+を使って、連続する区切り文字を1つにみなしています。

String str = "A    B  C        D";
String[] split = str.split(" +");
System.out.println(Arrays.toString(split)); // → ["A", "B", "C", "D"]
System.out.println(split.length); // → 4

3-3.文字単位に分割する

文字単位に分割したい場合は、区切り文字を“”とするといいかもしれません。少々裏技チックですが、文字の間の空文字列にマッチしていると考えてください。

String str = "ABCDEF";
String[] split = str.split("");
System.out.println(Arrays.toString(split)); // → ["A", "B", "C", "D", "E", "F"]
System.out.println(split.length); // → 6

3-4.改行で分割する

改行で分割したい場合は、単純に改行を区切り文字とすればOKです。末尾の空行も欲しいなら、2番目の引数にマイナスの数値を指定してください。

String str = "A\nBC\n\nD";
String[] split = str.split("\n");
System.out.println(Arrays.toString(split)); // → ["A", "BC", "", "D"]
System.out.println(split.length); // → 4

複数の種類の改行が含まれている可能性があるなら、それらを正規表現でor指定しましょう。

String str = "A\nBC\r\n\rD";
String[] split = str.split("\r\n|\r|\n");
System.out.println(Arrays.toString(split)); // → ["A", "BC", "", "D"]
System.out.println(split.length); // → 4

3-5.分割結果をListにする

splitは分割結果をStringの配列で戻します。でもListの方が使いやすい場合もありますので、java.util.ArraysasListを使って、Listに変換するのがお手軽です。

String str = "A,BC,,D";
List<String> split = Arrays.asList(str.split(","));
System.out.println(split); // → ["A", "BC", "", "D"]
System.out.println(split.size()); // → 4

3-6.分割文字自体を含める

少し特別な正規表現の書き方をすれば、分割に使った文字列そのものを結果に含められます。これは、正規表現の先読み・後読みと呼ばれる機能を使っています。

後ろに付ける場合は、以下のようにします。

String str = "A,BC,,D";
String[] split = str.split("(?<=,)");
System.out.println(Arrays.toString(split)); // → ["A,", "BC,", ",", "D"]
System.out.println(split.length); // → 4

前に付ける場合は以下のようにします。

String str = "A,BC,,D";
String[] split = str.split("(?=,)");
System.out.println(Arrays.toString(split)); // → ["A", ",BC", ",", ",D"]
System.out.println(split.length); // → 4

4.まとめ

この記事ではStringsplitを紹介しました。引数に指定した正規表現にマッチするものを区切り文字とし、文字列を分割して配列にするメソッドです。二番目の引数の数値を使うことで、どのような配列にするかを指定出来たりもします。

splitの使い方は簡単ですが、指定できるものが正規表現であることを活かすと、なかなかパワフルに使えたりもします。ぜひ正規表現について学んで、splitを便利に使いましょう。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

文系IT未経験歓迎!【23卒対象】新卒採用のエントリーを受付中!
文系IT未経験歓迎!
【23卒対象】新卒採用のエントリーを受付中!