String.splitの動作

他人が書いたコードを見て「バグだバグだ」と騒いでいたんですが結果的にバグではなくて不愉快な思いをさせてしまった。

 

原因はString.splitの動作についての勘違いで、

"unko@".split("@");

は、

{"unko",""}

になると思っていたのだけれど、実際には

{"unko"}

になる、というもので、ちょっと気になったので色々試してみたらなんだか違和感のある動きをした。

 

"@unko".split("@");

これが

{"","unko"}

になるのだ。

 

空文字は評価されないんじゃないのか・・・?と思ったのだけれど、これについては「一番最後の空文字は評価されない」ということでとりあえず納得した。

しかし、

"@".split("@");

が、

{}

になるのがいまいち納得いかない。

一体どういう基準なんだろう。

 しかも

"unko".split("@");

{"unko"}

になるのだ。

 

他の言語だとどうなるのかちょっと気になったのでいくつか試してみた。

Javascript

常に空文字が評価される。

"@".split("@")の要素数は2になる。

Ruby

Javaと同じ。

Perl

Javaと同じ。

Python

Javascriptと同じ。

Javascriptの動きのが自然だと思うんだけどこのJavaの動きはどうしてこうなったんだろう。

正規表現エンジンの違い?