split
調べてみると、プログラミング言語によって、split の細かい挙動が異なるのであった。
Perl, Ruby の場合
% ruby -e 'p "a-b--c-".split /-/' ["a", "b", "", "c"] % ruby -e 'p "a-b--c-".split /-/, -1' ["a", "b", "", "c", ""] % ruby -e 'p "a-b--c-".split /(-)/' ["a", "-", "b", "-", "", "-", "c", "-"] % ruby -e 'p "abc".split //' ["a", "b", "c"]
% perl -MData::Dumper -e 'print Dumper([split /-/, "a-b--c-"])' $VAR1 = [ 'a', 'b', '', 'c' ]; % perl -MData::Dumper -e 'print Dumper([split /-/, "a-b--c-", -1])' $VAR1 = [ 'a', 'b', '', 'c', '' ]; % perl -MData::Dumper -e 'print Dumper([split /(-)/, "a-b--c-"])' $VAR1 = [ 'a', '-', 'b', '-', '', '-', 'c', '-' ]; % perl -MData::Dumper -e 'print Dumper([split //, "abc"])' $VAR1 = [ 'a', 'b', 'c' ];
Python の場合
% python -c 'import re; print repr(re.split("-", "a-b--c-"))' ['a', 'b', '', 'c', ''] % python -c 'import re; print repr(re.split("(-)", "a-b--c-"))' ['a', '-', 'b', '-', '', '-', 'c', '-', ''] % python -c 'import re; print repr(re.split("", "abc"))' ['abc']
Java の場合
Groovy というか、Java の仕様。
% groovy -e 'println("a-b--c-".split(/-/))' [a, b, , c] % groovy -e 'println("a-b--c-".split(/(-)/, -1))' [a, b, , c, ] % groovy -e 'println("a-b--c-".split(/(-)/))' [a, b, , c] % groovy -e 'println("abc".split(""))' [, a, b, c] % groovy -e 'println("abc".split("", -1))' [, a, b, c, ]
JavaScript の場合
Java に標準で組み込まれている Rhino を使ってみる。
% jrunscript -e 'println("a-b--c-".split(/-/).toSource())' ["a", "b", "", "c", ""] % jrunscript -e 'println("a-b--c-".split(/(-)/).toSource())' ["a", "-", "b", "-", "", "-", "c", "-", ""] % jrunscript -e 'println("abc".split(new RegExp()).toSource())' ["a", "b", "c"]
末尾にデリミタが来る場合なんかを考えると分割数を常に指定しておいたほうが無難かなぁ。
しかし、末尾の空文字を削除するのは何なんだろな。