Java String#split()

Pythonだと、

',,,meow,,,'.split(',')

の実行結果は、

['', '', '', 'meow', '', '', '']

なんだけど、Javaだと

System.out.println(Arrays.toString(",,,meow,,,".split(",")));

は、

[, , , meow]

で、空文字列の要素が末尾まで続く場合は省略されてしまう。

なので、",,,,,,".split(",") なんかは空の配列が戻ってくる。

Pythonと同じ仕様の結果が欲しい場合は、第2引数 limit に負の数(なんでもいい)を与えればよいらしい。

何でそうなるのかと思ったら、デフォルト (limit == 0) の時は、ご丁寧に末尾の空要素の分だけ要素数を減らしているようだ。

        // Construct result
        int resultSize = list.size();
        if (limit == 0) {
            while (resultSize > 0 && list.get(resultSize - 1).isEmpty()) {
                resultSize--;
            }
        }
        String[] result = new String[resultSize];
        return list.subList(0, resultSize).toArray(result);

https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/String.java#L3157

Javaの方、変な仕様だなあと思ったけど、Perlも(負の数云々も含めて)ほぼ同じだった。すっかりPythonに染まっている(?)