タイトル
TOPJavaTIPS → This Page

String.splitの注意点【Java の TIPS、小ネタ、注意点】

前提

Java開発におけるStringクラスのsplitメソッドの注意点を紹介します。
このページに記載している内容は2024/10/30に書かれたものです。
掲載している内容が将来的に変更されている場合があります。

よく見かけるString.splitの使い方

カンマ区切りの文字列をカンマで分割して配列化するコード。
/**
 * String.splitの問題確認サンプル1
 * 
 * @author みっちー
 */
public class StringSplit1 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		System.out.println("String.splitの問題確認サンプル1");

		// 配列にしたい文字列
		String strValue = "イヌ,ネコ,ウサギ,ハムスター";

		// String.splitで分割して配列化
		String[] strArray = strValue.split(",");
		System.out.println("**********");
		for (int i = 0; i < strArray.length; i++) {
			System.out.println((i + 1) + "=" + strArray[i]);
		}
	}
}

実行結果
String.splitの問題確認サンプル1
**********
1=イヌ
2=ネコ
3=ウサギ
4=ハムスター

注意点1:末尾に空がある場合

分割したい文字列の末尾に空がある場合に想定外(?)の結果になります。
/**
 * String.splitの問題確認サンプル2
 * 
 * @author みっちー
 */
public class StringSplit2 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		System.out.println("String.splitの問題確認サンプル2");

		// 配列にしたい文字列
		String strValue1 = "イヌ,ネコ,ウサギ,ハムスター";
		String strValue2 = "イヌ,ネコ,,ウサギ,ハムスター,,";

		// String.splitで分割して配列化
		String[] strArray1 = strValue1.split(",");
		System.out.println("**********");
		for (int i = 0; i < strArray1.length; i++) {
			System.out.println((i + 1) + "=" + strArray1[i]);
		}

		// String.splitで分割して配列化
		String[] strArray2 = strValue2.split(",");
		System.out.println("**********");
		for (int i = 0; i < strArray2.length; i++) {
			System.out.println((i + 1) + "=" + strArray2[i]);
		}
	}
}

実行結果
String.splitの問題確認サンプル2
**********
1=イヌ
2=ネコ
3=ウサギ
4=ハムスター
**********
1=イヌ
2=ネコ
3=
4=ウサギ
5=ハムスター

6, 7番目に空要素が入る=つまりカンマの数だけ配列が出来ると思った人もいるのではないでしょうか?
しかし
6=
7=
が作られていません。

実はsplitメソッドの第二引数を省略した場合、デフォルトのゼロが指定されます。
splitメソッドの第二引数は作成する配列の最大数を意味しますが、
ゼロを指定された場合は末尾の空要素を破棄する仕様になっています。

第二引数に -1 を指定すると配列の最大数が無制限かつ空要素も破棄しないようになります。

それでは第二引数に -1 を指定してみます。
/**
 * String.splitの問題確認サンプル3
 * 
 * @author みっちー
 */
public class StringSplit3 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		System.out.println("String.splitの問題確認サンプル3");

		// 配列にしたい文字列
		String strValue1 = "イヌ,ネコ,ウサギ,ハムスター";
		String strValue2 = "イヌ,ネコ,,ウサギ,ハムスター,,";

		// String.splitで分割して配列化
		String[] strArray1 = strValue1.split(",", -1);
		System.out.println("**********");
		for (int i = 0; i < strArray1.length; i++) {
			System.out.println((i + 1) + "=" + strArray1[i]);
		}

		// String.splitで分割して配列化
		String[] strArray2 = strValue2.split(",", -1);
		System.out.println("**********");
		for (int i = 0; i < strArray2.length; i++) {
			System.out.println((i + 1) + "=" + strArray2[i]);
		}
	}
}

実行結果
String.splitの問題確認サンプル3
**********
1=イヌ
2=ネコ
3=ウサギ
4=ハムスター
**********
1=イヌ
2=ネコ
3=
4=ウサギ
5=ハムスター
6=
7=

ちなみに第二引数を
・想定の配列数より少ない数を指定
・想定の配列数より多い数を指定
した場合はどうなるでしょうか?
以下、そのサンプルです。
/**
 * String.splitの問題確認サンプル4
 * 
 * @author みっちー
 */
public class StringSplit4 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		System.out.println("String.splitの問題確認サンプル4");

		// 配列にしたい文字列
		String strValue = "イヌ,ネコ,,ウサギ,ハムスター,,";

		// String.splitで分割して配列化
		String[] strArray1 = strValue.split(",", 0);
		System.out.println("**********");
		for (int i = 0; i < strArray1.length; i++) {
			System.out.println((i + 1) + "=" + strArray1[i]);
		}

		// String.splitで分割して配列化
		String[] strArray2 = strValue.split(",", 4);
		System.out.println("**********");
		for (int i = 0; i < strArray2.length; i++) {
			System.out.println((i + 1) + "=" + strArray2[i]);
		}

		// String.splitで分割して配列化
		String[] strArray3 = strValue.split(",", 10);
		System.out.println("**********");
		for (int i = 0; i < strArray3.length; i++) {
			System.out.println((i + 1) + "=" + strArray3[i]);
		}
	}
}

実行結果
String.splitの問題確認サンプル4
**********
1=イヌ
2=ネコ
3=
4=ウサギ
5=ハムスター
**********
1=イヌ
2=ネコ
3=
4=ウサギ,ハムスター,,
**********
1=イヌ
2=ネコ
3=
4=ウサギ
5=ハムスター
6=
7=

・想定の配列数より少ない数を指定
  →最後の要素が分割されずに1つの文字列になってしまいました。
・想定の配列数より多い数を指定
  →実際の分割数ででちゃんと分割されました。

注意点2:第一引数は実は正規表現

ピリオドで文字を分割したい場合。
/**
 * String.splitの問題確認サンプル5
 * 
 * @author みっちー
 */
public class StringSplit5 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		System.out.println("String.splitの問題確認サンプル5");

		// 配列にしたい文字列
		String strValue = "イヌ.ネコ.ウサギ.ハムスター";

		// String.splitで分割して配列化
		String[] strArray = strValue.split(".");
		System.out.println("**********");
		for (int i = 0; i < strArray.length; i++) {
			System.out.println((i + 1) + "=" + strArray[i]);
		}
	}
}

実行結果
String.splitの問題確認サンプル5
**********
なんと、分割されずに空配列になってしまいました。
これはsplitメソッドの第一引数で指定された文字列を使って「正規表現」で分割するからです。

「正規表現」ではピリオドは「任意の1文字」を表すので、
「すべての文字が区切り文字」と判定されてこのような結果になってしまいます。
ピリオドで分割したい場合はピリオドをエスケープして \\. を指定します。
/**
 * String.splitの問題確認サンプル6
 * 
 * @author みっちー
 */
public class StringSplit6 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		System.out.println("String.splitの問題確認サンプル6");

		// 配列にしたい文字列
		String strValue = "イヌ.ネコ.ウサギ.ハムスター";

		// String.splitで分割して配列化
		String[] strArray = strValue.split("\\.");
		System.out.println("**********");
		for (int i = 0; i < strArray.length; i++) {
			System.out.println((i + 1) + "=" + strArray[i]);
		}
	}
}

実行結果
String.splitの問題確認サンプル6
**********
1=イヌ
2=ネコ
3=ウサギ
4=ハムスター
無事に分割されました。

更新履歴

2024/10/30 新規作成

TOPJavaTIPS → This Page