Javaのsplitとは?文字列を分割するsplitの使い方【サンプル付き】
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
文字列が区切り文字を含まない場合は、文字列がそのまま設定された、長さ1のString配列が戻ります。
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.Patternのquoteなどを使いましょう。
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.ArraysのasListを使って、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.まとめ
この記事ではStringのsplitを紹介しました。引数に指定した正規表現にマッチするものを区切り文字とし、文字列を分割して配列にするメソッドです。二番目の引数の数値を使うことで、どのような配列にするかを指定出来たりもします。
splitの使い方は簡単ですが、指定できるものが正規表現であることを活かすと、なかなかパワフルに使えたりもします。ぜひ正規表現について学んで、splitを便利に使いましょう。
コメント