StringUtils.split(String, String)と標準APIのString.split(String)の違い

Jakarta Commonsを勉強中。

Jakarta Commonsクックブック ―Javaプロジェクト必須のレシピ集

Jakarta Commonsクックブック ―Javaプロジェクト必須のレシピ集

以下テスト用コード。

import org.apache.commons.lang.StringUtils;


public class Main_JakartaTest {

    public static void main(String[] args) {
        
        String str = "ab, ,c d,,e,";  // 分割する文字列。

        // java.lang.String.split
        String[] java_lang_split = str.split(",");
        
        System.out.println("java.lang.String.split######");
        for (String tmp : java_lang_split) {
            System.out.println(tmp);
        }
        System.out.println("############################\n");

        // StringUtils.split
        String[] commons_split   = StringUtils.split(str, ",");

        System.out.println("commons.StringUtils.split###");
        for (String tmp : commons_split) {
            System.out.println(tmp);
        }
        System.out.println("############################\n");

    }
}

以下実行結果。

java.lang.String.split######
ab
 
c d

e
############################

commons.StringUtils.split###
ab
 
c d
e
############################

次に、先頭と最後のデリミタの扱いを調べるためのコードを実行。

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

public class Split {

    public static void main(String[] args) {
        
        String[] hoge = ",a,,b,".split(",", -1);
        System.out.println("Length: " + hoge.length
                + ", Array: " + ArrayUtils.toString(hoge));

        String[] hige = ",a,,b,".split(",", 0);
        System.out.println("Length: " + hige.length
                + ", Array: " + ArrayUtils.toString(hige));
        
        String[] hoga = StringUtils.split(",a,,b,", ",", 0);
        System.out.println("Length: " + hoga.length
                + ", Array: " + ArrayUtils.toString(hoga));

    }
}

以下実行結果。

Length: 5, Array: {,a,,b,}
Length: 4, Array: {,a,,b}
Length: 2, Array: {a,b}

結論。

  • java.lang.String.splitはデリミタが連続している場合、間にデータがあるとみなす。
  • StringUtils.splitはデリミタが連続している場合、データは無いとみなす。
  • CSVデータとかを分割するなら、java.lang.String.split(str, ",", -1)とかしてやると、先頭も最後もデータ有りとみなされていい感じ。