Version

  • Java 11
  • Apache Commons Lang 3.3.9

空文字をsplitした時の挙動

空文字をスペースで分割したい時、StringUtilsを使うと空配列ができるが、Stringの標準ライブラリのメソッド(split)を使うと空文字が一つだけ入った配列ができる。

@Test
public void testSplit() {
    String[] utils = StringUtils.split("");
    String[] standards = "".split(" +");

    assertThat(utils).isEqualTo(standards);
}

// Expected :[""]
// Actual   :[]

StringUtilsは文字列を配列に変換するような実際によくある要件に沿うようになっているが、Stringの方はあくまで文字列を正規表現に則って分割しているだけなので、空文字が勝手に消えることはない。

多くの場合、StringUtilsを使用することで要件を実現できる。

全角スペース等への対処

StringUtilsは全角スペース等も区切り文字として使用してしまう。厳密に半角スペースだけで分割したい場合は、StringUtilsのsplitByWholeSeparatorを使うといい。

@Test
public void testSplitByWholeSeparator() {
    // splitだと全角スペースも区切り文字として扱われる
    assertThat(StringUtils.split("あ い")).hasSize(2);
    
    // splitByWholeSeparatorで半角スペースを指定すると、全角では区切られなくなる
    assertThat(StringUtils.splitByWholeSeparator("あ い", " ")).hasSize(1);
}

注意しなければいけないのはsplit(String str, String separatorChars)である。 separatorCharsで分割できるのだが、これは一つの文字列で分割するのではなくて、separatorCharsで指定した文字列を1文字ずつ分解して、それらを全て区切り文字とするというもの。分かりづらいしあまり使わないほうがいいと思う。