できない.dev

文字列を分割するには

区切り文字で文字列を配列(リスト)へ分ける基本形を各言語で示す。
分割回数を制限する第2引数の意味が言語ごとに違う点と、区切りが正規表現として解釈される言語までを扱う。

公開:

各言語見出しの横のバッジは検証状態を表す。実行確認済みはコードを実際に実行して確認したもの、静的確認は構文と公式 API ドキュメントで確認したものである。

Python 実行確認済み

line = "2026-07-31,tokyo,rain"
print(line.split(","))           # 区切り文字で全部分割 -> ['2026-07-31', 'tokyo', 'rain']
print(line.split(",", 1))        # 第2引数は「分割する回数」 -> ['2026-07-31', 'tokyo,rain']
print("  a b  c ".split())       # 引数なしは連続する空白をまとめて分割 -> ['a', 'b', 'c']
date, rest = line.split(",", 1)  # 個数を決め打ちして受け取る
print(date, rest)

str.split は区切り文字で分けたリストを返す。
第2引数の maxsplit は「分割する回数」の上限なので、1 を渡すと要素は 2 個になる。
引数なしで呼ぶと連続する空白をまとめて 1 つの区切りとして扱うため、空白区切りのテキストはこちらが扱いやすい。

うまくいかない時: Python で「too many values to unpack」が解決できない

JavaScript 実行確認済み

const line = "2026-07-31,tokyo,rain";
console.log(line.split(","));       // [ '2026-07-31', 'tokyo', 'rain' ]
console.log(line.split(",", 2));    // 第2引数は「返す要素数の上限」 -> [ '2026-07-31', 'tokyo' ]
console.log("a1b22c".split(/\d+/)); // 正規表現でも分割できる -> [ 'a', 'b', 'c' ]
const [date, ...rest] = line.split(",");
console.log(date, rest.join(","));

String.prototype.split は区切りに文字列と正規表現のどちらも渡せる。
第2引数の limit は Python の maxsplit と違って「返す配列の長さの上限」であり、あふれた分は切り捨てられて復元できない。
先頭だけ取り出して残りをまとめたいときは、分割してから分割代入で受けるほうが安全である。

TypeScript 実行確認済み

const line = "2026-07-31,tokyo,rain";
const parts: string[] = line.split(",");
console.log(parts);                       // [ '2026-07-31', 'tokyo', 'rain' ]
const [date, ...rest]: string[] = parts;  // 先頭と残りに分ける
console.log(date, rest.join(","));

使い方は JavaScript と同じで、戻り値が string[] として型付けされるだけである。
要素数は型に現れないため、parts[3] のような添字アクセスは存在しない要素でも型エラーにならない。
件数が決まっている入力なら分割代入で受け取り、足りない場合の分岐を明示するとよい。

Go 静的確認

package main
 
import (
	"fmt"
	"strings"
)
 
func main() {
	line := "2026-07-31,tokyo,rain"
	fmt.Println(strings.Split(line, ","))     // [2026-07-31 tokyo rain]
	fmt.Println(strings.SplitN(line, ",", 2)) // 最大 2 要素 -> [2026-07-31 tokyo,rain]
	fmt.Println(strings.Fields("  a b  c "))  // 連続する空白でまとめて分割 -> [a b c]
}

strings.Split は区切り文字列で分けたスライスを返し、要素数を絞りたいときは strings.SplitN に上限を渡す。
区切りは正規表現ではなくただの文字列として扱われるため、記号をそのまま渡してよい。
空白区切りは strings.Fields のほうが連続空白をまとめてくれる。

Rust 静的確認

fn main() {
    let line = "2026-07-31,tokyo,rain";
    let parts: Vec<&str> = line.split(',').collect();
    println!("{:?}", parts);
 
    let mut it = line.splitn(2, ','); // 最大 2 要素に分ける
    println!("{:?} {:?}", it.next(), it.next());
 
    println!("{:?}", "  a b  c ".split_whitespace().collect::<Vec<_>>());
}

str::split はイテレータを返すため、配列として扱いたいときは collect でまとめる。
元の文字列を借用した &str のスライスが返るだけなので、コピーは発生しない。
要素数を絞るなら splitn、空白区切りなら split_whitespace を使う。

Java 静的確認

import java.util.Arrays;
 
public class Main {
    public static void main(String[] args) {
        String line = "2026-07-31,tokyo,rain";
        System.out.println(Arrays.toString(line.split(",")));
        System.out.println(Arrays.toString(line.split(",", 2))); // limit は返す要素数の上限
        System.out.println(Arrays.toString("  a b  c ".trim().split("\\s+")));
    }
}

String.split の第1引数は文字列ではなく正規表現として解釈される。
ドットやパイプなどのメタ文字をそのまま渡すと意図しない分割になるため、リテラルとして分けたいときは Pattern.quote で囲むかエスケープする。
空白区切りは split("\\s+") のように正規表現を渡すと連続空白をまとめられる。

C# 静的確認

using System;
 
class Program {
    static void Main() {
        var line = "2026-07-31,tokyo,rain";
        Console.WriteLine(string.Join(" | ", line.Split(',')));
        Console.WriteLine(string.Join(" | ", line.Split(',', 2))); // count は返す要素数の上限
        Console.WriteLine(string.Join(" | ",
            "  a b  c ".Split(' ', StringSplitOptions.RemoveEmptyEntries)));
    }
}

string.Split は区切りを文字列として扱い、正規表現は解釈しない。
count を渡すと返す要素数の上限になり、あふれた分は最後の要素へまとめて残る。
連続する空白で空文字が混ざるのを避けたいときは StringSplitOptions.RemoveEmptyEntries を指定する。

つまずき

分割回数を指定する第2引数の意味は言語で揃っていない。
Python の maxsplit は「分割する回数」なので 1 を渡すと要素は 2 個になるが、JavaScript の limit と Java・C# の第2引数は「返す要素数の上限」である。
さらに JavaScript は上限を超えた分を切り捨てるのに対し、Python・Go・Java・C# は残りを最後の要素へまとめて残す。
「先頭だけ取り出して残りは丸ごと使う」という書き方は JavaScript では成立しないので、分割してから分割代入で受け取る。

区切りは文字列か正規表現か

Java の String.split は第1引数を正規表現として解釈するため、split(".") は任意の 1 文字にマッチして結果が空配列になる。
ドットやパイプで区切りたいときはエスケープするか Pattern.quote で囲む。
Python・Go・Rust・C# の分割関数は区切りを文字列として扱い、正規表現で分けたい場合は Python なら re.split のように別の関数を使う。
JavaScript は文字列と正規表現の両方を受け付けるので、渡した値の型で挙動が変わる点に注意する。