「東京,大阪,」をカンマで区切ると、項目はいくつでしょうか。最後のカンマの後ろに空の項目が1つあると数えれば、3項目です。各言語のいちばん普通の split で区切ると、10言語中3言語が2項目と答えました。
何をしたか
CODE Polyglot の入門 第14回 は、カンマ区切りの文字列を区切って、項目の数と中身を出すプログラムです。カンマとカンマの間が何もなければ空の項目として数え、「(空)」と出すのが正解です。先頭や最後のカンマの外側も、空の項目として数えます。
Java ならこう書きます。
String[] items = s.split(",");
System.out.println(items.length + "項目");
毎朝の検証と同じ Linux の環境で動かした結果です。
| 入力 | 正解 | Java split(",")・Ruby split(",") | Swift split(separator: ",") | ほかの7言語 |
|---|---|---|---|---|
東京,大阪,名古屋 | 3項目 | 3項目 | 3項目 | 3項目 |
東京,,名古屋 | 3項目 | 3項目 | 2項目 | 3項目 |
東京,大阪, | 3項目 | 2項目 | 2項目 | 3項目 |
東京,,, | 4項目 | 1項目 | 1項目 | 4項目 |
,東京 | 2項目 | 2項目 | 1項目 | 2項目 |
「ほかの7言語」は、PHP explode・Python split(",")・Go strings.Split・JavaScript split(",")・C# Split(',')・Kotlin split(",")・Rust split(',') です。どれも空の項目をすべて残しました。
捨て方は2通り
- Java・Ruby: 最後に続く空の項目だけを捨てる。途中と先頭の空の項目は残す。
東京,,,は、最後の3つがすべて空なので、1項目になった - Swift:
split(separator:)は、空の項目を場所に関係なくすべて捨てる
Java と Ruby は、空の項目が途中にあるときは正しく数えるので、テストの入力が 東京,,名古屋 だけだと気づけません。最後がカンマで終わる入力を試して、はじめて分かります。
なぜ困るか
CSV の1行や、フォームの「カンマ区切りで入力」の欄では、空の項目にも意味があります。たとえば「名前,電話,メール」の電話だけが空の行で空の項目が消えると、メールが2番目に繰り上がります(Swift の場合)。最後の項目が空の行では、Java・Ruby でも、上の 東京,大阪, と同じように項目の数が1つ減ります。
どう直したか
Java と Ruby は、2つ目の引数に -1 を渡すと、最後の空の項目も残します。
// split(",") は最後に続く空の項目を取り除くので、2つ目の引数に -1 を渡して残す
String[] items = s.split(",", -1);
# split(",") は最後の空の項目を捨てる。2つ目の引数に -1 を渡すと、最後の空の項目も残す
items = s.split(",", -1)
Swift は、omittingEmptySubsequences: false を付けます。
// split(separator:) は空の項目をすべて取り除くので、omittingEmptySubsequences: false で残す
let items = s.split(separator: ",", omittingEmptySubsequences: false)
直した版は、10言語とも8件中8件が正解になりました。
まとめ
- 同じ
splitという名前でも、空の項目の扱いは言語によって違う。10言語中3言語が、最後の空の項目を捨てた - Java・Ruby は最後に続く空の項目だけ、Swift は空の項目をすべて捨てる。Java・Ruby は途中の空の項目では気づけない
- 空の項目を残すなら、Java・Ruby は
split(",", -1)、Swift はomittingEmptySubsequences: false - テストには「最後がカンマで終わる入力」を入れる
- 10言語の全プログラムは 入門 第14回 にあります
- 第1回:「2026-02-30」を渡したら、PHP と JavaScript だけが黙って3月2日にした
- 第2回:JavaScript で「月の最終日」を出したら、日本では毎回1日前になった
- 第3回:C# の Normalize(FormKC) が、Docker の中では何もしなかった
- 第4回:辞書の「取り出す順番」を10言語で20回ずつ試したら、5通りの性格に分かれた
- 第5回:「+5」を整数に直したら、10言語すべてが黙って 5 にした
- 第6回:メールアドレスの正規表現の「$」が、最後の改行を通した
- 第7回:「東京,大阪,」を split したら、Java・Ruby・Swift は最後の空の項目を捨てた(この記事)
- 第8回:Excel の「CSV UTF-8」を読ませたら、10言語すべてが見出しの行を見失った
Analyzegear


