【JavaScript】split()で文字列を分割する方法|正規表現・CSV解析・実務パターンまで完全解説

JavaScriptで文字列を特定の区切り文字で分割するには、String.prototype.split()メソッドを使います。カンマ区切りのCSVデータの処理から、URLの解析、ログファイルのパースまで、文字列分割は実務で最も頻繁に使う操作の一つです。

この記事では、split()の基本構文から、正規表現による高度な分割分割数の制限区切り文字を結果に残す方法CSV/TSVパースsplit + map/filter/reduce の組み合わせURL解析・パス分割・クエリパラメータ解析など実務パターンまで網羅的に解説します。

この記事で学べること

  • split()メソッドの基本構文と引数の使い方
  • 文字列で分割(カンマ、スペース、タブ、改行など)
  • 正規表現で複数の区切り文字を同時に指定する方法
  • 分割数の制限(第2引数 limit
  • 区切り文字を結果に残す方法(キャプチャグループ
  • 空文字列で分割して1文字ずつ配列化する方法
  • CSV/TSVのパーステクニック
  • split + map/filter/reduce組み合わせ
  • Array.join()逆変換(配列→文字列)
  • 実務パターン(URL解析・パス分割・クエリパラメータ解析
  • ブラウザ互換性とよくある落とし穴
スポンサーリンク

split()メソッドの基本構文と引数

split()は文字列を指定した区切り文字(セパレータ)で分割し、配列を返すメソッドです。

構文
str.split(separator, limit)
引数 説明
separator String / RegExp 区切り文字または正規表現。省略すると元の文字列が要素1つの配列になる
limit Number 分割する最大数。省略するとすべて分割される
JavaScript – split()の基本
const str = "apple,banana,orange,grape";

// カンマで分割
const fruits = str.split(",");
console.log(fruits);
// ["apple", "banana", "orange", "grape"]

// separator を省略
console.log(str.split());
// ["apple,banana,orange,grape"]  ← 配列の要素が1つ

実行結果

["apple", "banana", "orange", "grape"]
["apple,banana,orange,grape"]

文字列で分割(カンマ・スペース・タブ・改行)

最もよく使うのは、特定の1文字や文字列を区切り文字に指定するパターンです。

カンマで分割

JavaScript – カンマ区切り
const csv = "東京,大阪,名古屋,福岡";
const cities = csv.split(",");
console.log(cities);
// ["東京", "大阪", "名古屋", "福岡"]

スペースで分割

JavaScript – スペース区切り
const sentence = "JavaScript is a powerful language";
const words = sentence.split(" ");
console.log(words);
// ["JavaScript", "is", "a", "powerful", "language"]

改行で分割

JavaScript – 改行区切り
const text = "1行目\n2行目\n3行目";
const lines = text.split("\n");
console.log(lines);
// ["1行目", "2行目", "3行目"]

// Windows の改行コード(\r\n)にも対応
const winText = "行A\r\n行B\r\n行C";
console.log(winText.split("\r\n"));
// ["行A", "行B", "行C"]

複数文字の区切り文字

JavaScript – 複数文字の区切り
const data = "item1 - item2 - item3";
const items = data.split(" - ");
console.log(items);
// ["item1", "item2", "item3"]

// 区切り文字は完全一致で検索される
const log = "2024-01-15::ERROR::ファイルが見つかりません";
console.log(log.split("::"));
// ["2024-01-15", "ERROR", "ファイルが見つかりません"]

実行結果

["item1", "item2", "item3"]
["2024-01-15", "ERROR", "ファイルが見つかりません"]

正規表現で分割(複数の区切り文字を同時に指定)

split()の第1引数には正規表現(RegExp)も指定できます。これにより、複数種類の区切り文字をまとめて処理できます。

複数の区切り文字で分割

JavaScript – 複数区切り文字(正規表現)
// カンマ、セミコロン、スペースのいずれかで分割
const mixed = "apple,banana;cherry orange";
const result = mixed.split(/[,; ]/);
console.log(result);
// ["apple", "banana", "cherry", "orange"]

実行結果

["apple", "banana", "cherry", "orange"]

連続する空白文字で分割

JavaScript – 連続空白で分割(\s+)
// \s+ で連続する空白(スペース・タブ・改行)をまとめて分割
const messy = "apple   banana\tcherry\norange";
const clean = messy.split(/\s+/);
console.log(clean);
// ["apple", "banana", "cherry", "orange"]

// 先頭・末尾の空白がある場合は空文字列に注意
const padded = "  hello  world  ";
console.log(padded.split(/\s+/));
// ["", "hello", "world", ""]  ← 先頭・末尾に空文字列

// trim() で先頭・末尾の空白を除去してから分割
console.log(padded.trim().split(/\s+/));
// ["hello", "world"]

注意:先頭や末尾に区切り文字がある場合、空文字列 "" が配列に含まれます。trim() で事前に除去するか、filter(Boolean) で空要素を除外しましょう。

改行コードの統一分割

JavaScript – OS混在の改行コードを統一分割
// Windows(\r\n)、Mac旧(\r)、Unix(\n) すべてに対応
const multiOS = "行1\r\n行2\n行3\r行4";
const lines = multiOS.split(/\r?\n|\r/);
console.log(lines);
// ["行1", "行2", "行3", "行4"]

ポイント:/\r?\n|\r/ は「\r\n(Windows)」「\n(Unix/Mac)」「\r(旧Mac)」のすべてにマッチします。外部ファイルやAPIレスポンスを行分割するときの定番パターンです。

分割数の制限(第2引数 limit)

split()の第2引数 limit を指定すると、配列の要素数を制限できます。先頭から指定した数だけ分割し、残りは無視されます。

JavaScript – limit で分割数を制限
const str = "a,b,c,d,e";

// 最大3つまで分割
console.log(str.split(",", 3));
// ["a", "b", "c"]  ← "d", "e" は無視

// limit = 1 → 最初の要素のみ
console.log(str.split(",", 1));
// ["a"]

// limit = 0 → 空配列
console.log(str.split(",", 0));
// []

実行結果

["a", "b", "c"]
["a"]
[]

limit の実務的な使い方

JavaScript – limit の実務パターン
// ログの先頭部分だけ取得(日時とレベルのみ)
const log = "2024-01-15 ERROR Connection refused: server timeout";
const [date, level] = log.split(" ", 2);
console.log(date);   // "2024-01-15"
console.log(level);  // "ERROR"

// key=value の分割(値に = が含まれる場合)
const pair = "message=Hello=World";
const [key, ...rest] = pair.split("=");
const value = rest.join("=");
console.log(key);    // "message"
console.log(value);  // "Hello=World"

ポイント:limit は「残りを1つにまとめる」のではなく「超過分を切り捨て」ます。残り全体を取得するには、上記のように分割構文 + rest パラメータ + join を組み合わせましょう。

区切り文字を結果に残す方法(キャプチャグループ)

通常、split()は区切り文字を結果から除外します。しかし、正規表現でキャプチャグループ () を使うと、区切り文字自体も配列の要素として残ります。

JavaScript – キャプチャグループで区切り文字を残す
const expr = "10+20-30*40";

// キャプチャグループなし → 区切り文字は消える
console.log(expr.split(/[+\-*]/));
// ["10", "20", "30", "40"]

// キャプチャグループあり → 区切り文字が残る
console.log(expr.split(/([+\-*])/));
// ["10", "+", "20", "-", "30", "*", "40"]

実行結果

["10", "20", "30", "40"]
["10", "+", "20", "-", "30", "*", "40"]

この仕組みは、数式パーサーやテキストのトークン分割で非常に便利です。

応用: 文章を句読点付きで分割

JavaScript – 句読点を残して文章を分割
const text = "今日は晴れです。明日は雨かもしれません。傘を持っていきましょう。";

// 句点で分割(句点を残す)
const sentences = text.split(/(。)/).filter(Boolean);
console.log(sentences);
// ["今日は晴れです", "。", "明日は雨かもしれません", "。", "傘を持っていきましょう", "。"]

// 区切り文字を前の要素に結合する
const merged = text.split(/(。)/).reduce((acc, part, i) => {
  if (i % 2 === 0) acc.push(part);
  else acc[acc.length - 1] += part;
  return acc;
}, []).filter(Boolean);
console.log(merged);
// ["今日は晴れです。", "明日は雨かもしれません。", "傘を持っていきましょう。"]

空文字列で分割(1文字ずつ配列化)

split("") で空文字列を区切り文字に指定すると、文字列を1文字ずつ分割して配列にできます。

JavaScript – 1文字ずつ分割
const str = "Hello";
console.log(str.split(""));
// ["H", "e", "l", "l", "o"]

// 文字列を反転
const reversed = str.split("").reverse().join("");
console.log(reversed);
// "olleH"

実行結果

["H", "e", "l", "l", "o"]
"olleH"

注意:split("")サロゲートペア(絵文字や一部の漢字)を正しく分割できません。Unicode対応が必要な場合は Array.from(str) または [...str](スプレッド構文)を使いましょう。

JavaScript – サロゲートペアの扱い
const emoji = "Hello?";

// split("") → サロゲートペアが壊れる
console.log(emoji.split(""));
// ["H", "e", "l", "l", "o", "\ud83c", "\udf0d"]  ← 壊れる

// スプレッド構文 → 正しく分割
console.log([...emoji]);
// ["H", "e", "l", "l", "o", "?"]

// Array.from → 同じく正しく分割
console.log(Array.from(emoji));
// ["H", "e", "l", "l", "o", "?"]

CSV/TSVのパース

split()CSV(カンマ区切り)TSV(タブ区切り)の簡易パースに最適です。

基本的なCSVパース

JavaScript – CSVデータのパース
const csvData = `名前,年齢,都市
田中太郎,30,東京
佐藤花子,25,大阪
鈴木一郎,35,名古屋`;

// 行で分割 → 各行をカンマで分割
const rows = csvData.split("\n");
const headers = rows[0].split(",");
const data = rows.slice(1).map(row => {
  const cols = row.split(",");
  return Object.fromEntries(
    headers.map((h, i) => [h, cols[i]])
  );
});

console.log(data);

実行結果

[
  { 名前: "田中太郎", 年齢: "30", 都市: "東京" },
  { 名前: "佐藤花子", 年齢: "25", 都市: "大阪" },
  { 名前: "鈴木一郎", 年齢: "35", 都市: "名古屋" }
]

TSV(タブ区切り)のパース

JavaScript – TSVデータのパース
const tsv = "ID\t商品名\t価格\n1\tりんご\t150\n2\tバナナ\t100\n3\tみかん\t80";

const [header, ...body] = tsv.split("\n");
const keys = header.split("\t");

const products = body.map(line => {
  const vals = line.split("\t");
  return Object.fromEntries(keys.map((k, i) => [k, vals[i]]));
});

console.log(products);

実行結果

[
  { ID: "1", 商品名: "りんご", 価格: "150" },
  { ID: "2", 商品名: "バナナ", 価格: "100" },
  { ID: "3", 商品名: "みかん", 価格: "80" }
]

注意:上記は簡易パーサーです。フィールド内にカンマや改行を含む正式なCSV(RFC 4180準拠)を扱うには、Papa Parse などの専用ライブラリを検討しましょう。

split + map / filter / reduce の組み合わせ

split()で得られた配列に対して、mapfilterreduceを組み合わせると、文字列の加工・集計を一気に行えます。

split + map(各要素を変換)

JavaScript – split + map
// カンマ区切りの数値文字列を数値配列に変換
const nums = "10,20,30,40,50";
const numbers = nums.split(",").map(Number);
console.log(numbers);
// [10, 20, 30, 40, 50]

// 各単語の先頭を大文字化(Title Case)
const title = "hello world from javascript";
const titleCase = title
  .split(" ")
  .map(w => w[0].toUpperCase() + w.slice(1))
  .join(" ");
console.log(titleCase);
// "Hello World From Javascript"

実行結果

[10, 20, 30, 40, 50]
"Hello World From Javascript"

split + filter(空要素の除去・条件抽出)

JavaScript – split + filter
// 空要素を除去
const messy = ",apple,,banana,,,orange,";
const clean = messy.split(",").filter(Boolean);
console.log(clean);
// ["apple", "banana", "orange"]

// タグの中から特定のプレフィックスを持つものだけ抽出
const tags = "js:react,css:tailwind,js:vue,py:django";
const jsTags = tags
  .split(",")
  .filter(t => t.startsWith("js:"))
  .map(t => t.replace("js:", ""));
console.log(jsTags);
// ["react", "vue"]

split + reduce(集計・変換)

JavaScript – split + reduce
// カンマ区切りの数値の合計
const prices = "100,250,300,150";
const total = prices
  .split(",")
  .reduce((sum, p) => sum + Number(p), 0);
console.log(total);
// 800

// 単語の出現回数をカウント
const text = "apple banana apple cherry banana apple";
const count = text.split(" ").reduce((acc, word) => {
  acc[word] = (acc[word] || 0) + 1;
  return acc;
}, {});
console.log(count);
// { apple: 3, banana: 2, cherry: 1 }

実行結果

800
{ apple: 3, banana: 2, cherry: 1 }

Array.join()で逆変換(配列→文字列)

split()の逆操作が Array.prototype.join() です。配列の全要素を指定した区切り文字で結合して文字列を返します。

JavaScript – split と join の往復
const original = "apple,banana,orange";

// split で分割 → join で復元
const arr = original.split(",");
console.log(arr.join(","));   // "apple,banana,orange"
console.log(arr.join(" | ")); // "apple | banana | orange"
console.log(arr.join(""));    // "applebananaorange"

// 引数なし → カンマで結合
console.log(arr.join());     // "apple,banana,orange"

実行結果

"apple,banana,orange"
"apple | banana | orange"
"applebananaorange"
"apple,banana,orange"

split + 加工 + join のパターン

JavaScript – 区切り文字の変換
// ケバブケース → キャメルケース
function kebabToCamel(str) {
  return str.split("-").map((word, i) =>
    i === 0 ? word : word[0].toUpperCase() + word.slice(1)
  ).join("");
}

// スネークケース → ケバブケース
function snakeToKebab(str) {
  return str.split("_").join("-");
}

console.log(kebabToCamel("background-color"));
// "backgroundColor"

console.log(snakeToKebab("user_first_name"));
// "user-first-name"

実行結果

"backgroundColor"
"user-first-name"

実務パターン(URL解析・パス分割・クエリパラメータ解析)

実務で頻出するsplit()の活用パターンをまとめます。

URLのパス部分を分割

JavaScript – URLパスの分割
const url = "https://example.com/blog/2024/javascript-split";

// URLオブジェクトで安全にパス取得 → split で分割
const pathname = new URL(url).pathname;
const segments = pathname.split("/").filter(Boolean);
console.log(segments);
// ["blog", "2024", "javascript-split"]

// 各セグメントを取得
const [section, year, slug] = segments;
console.log(section);  // "blog"
console.log(year);     // "2024"
console.log(slug);     // "javascript-split"

クエリパラメータの解析

JavaScript – クエリパラメータの解析
// split で手動解析(仕組みの理解用)
const query = "page=2&category=js&sort=date&order=desc";

const params = query.split("&").reduce((obj, pair) => {
  const [key, ...rest] = pair.split("=");
  obj[key] = rest.join("=");  // 値に = が含まれる場合に対応
  return obj;
}, {});

console.log(params);
// { page: "2", category: "js", sort: "date", order: "desc" }

実行結果

{ page: "2", category: "js", sort: "date", order: "desc" }

ポイント:実務では new URLSearchParams(query) を使うのがベストプラクティスです。splitによる手動パースは仕組みの理解や、URLSearchParams が使えない環境で役立ちます。

URLSearchParams を使った推奨方法

JavaScript – URLSearchParams(推奨)
const url = "https://example.com/search?q=JavaScript+split&page=3";
const searchParams = new URL(url).searchParams;

console.log(searchParams.get("q"));     // "JavaScript split"
console.log(searchParams.get("page"));  // "3"

// 全パラメータをオブジェクトに変換
const allParams = Object.fromEntries(searchParams);
console.log(allParams);
// { q: "JavaScript split", page: "3" }

ファイルパスの分割

JavaScript – ファイルパスの分割
const filePath = "/home/user/documents/report.pdf";

// ディレクトリとファイル名を分離
const parts = filePath.split("/");
const fileName = parts.pop();        // "report.pdf"
const dirPath = parts.join("/");    // "/home/user/documents"

// ファイル名と拡張子を分離
const [name, ext] = fileName.split(".");
console.log(name);  // "report"
console.log(ext);   // "pdf"

// 拡張子が複数のドットを含む場合(例: archive.tar.gz)
const complex = "archive.tar.gz";
const dotParts = complex.split(".");
const baseName = dotParts[0];              // "archive"
const fullExt = dotParts.slice(1).join("."); // "tar.gz"
console.log(baseName, fullExt);

実行結果

"report"
"pdf"
"archive" "tar.gz"

メールアドレスの分割

JavaScript – メールアドレスの分割
const email = "user@example.com";
const [localPart, domain] = email.split("@");

console.log(localPart);  // "user"
console.log(domain);     // "example.com"

// ドメインからTLDを取得
const domainParts = domain.split(".");
const tld = domainParts[domainParts.length - 1];
console.log(tld);  // "com"

よくある落とし穴・注意点

split()を使う際に注意すべきポイントをまとめます。

パターン 結果 説明
"".split(",") [""] 空文字列を分割すると、空文字列1つの配列になる(空配列ではない)
"a,,b".split(",") ["a","","b"] 連続する区切り文字の間に空文字列が入る
",a,b,".split(",") ["","a","b",""] 先頭・末尾の区切り文字で空文字列が生じる
"abc".split("") ["a","b","c"] 空文字列で分割すると1文字ずつの配列になる
"abc".split() ["abc"] 引数なし → 元の文字列が要素1つの配列になる
JavaScript – 落とし穴の実例
// 落とし穴1: 空文字列の分割
const empty = "";
console.log(empty.split(","));        // [""]  ← 空配列ではない!
console.log(empty.split(",").length); // 1    ← 0 ではない!

// 安全なパターン: 空文字列チェック
function safeSplit(str, sep) {
  if (!str) return [];
  return str.split(sep).filter(Boolean);
}

console.log(safeSplit("", ","));           // []
console.log(safeSplit("a,,b,,c", ","));   // ["a", "b", "c"]
console.log(safeSplit("a,b,c", ","));     // ["a", "b", "c"]

ブラウザ互換性

String.prototype.split() は ECMAScript 1(ES1)で定義されており、すべてのブラウザで完全にサポートされています。

機能 Chrome Firefox Safari Edge IE
split(string) 1+ 1+ 1+ 12+ 3+
split(regexp) 1+ 1+ 1+ 12+ 4+
split(regexp) キャプチャグループ 1+ 1+ 1+ 12+ 非対応
URLSearchParams 49+ 44+ 10.1+ 17+ 非対応
Array.from() / スプレッド構文 45+ 32+ 9+ 12+ 非対応

ポイント:split()自体はすべてのブラウザで問題なく使えます。ただし、IE では正規表現のキャプチャグループが結果に含まれない挙動があるため、IE 対応が必要な場合は注意が必要です。

split() メソッドまとめ

この記事で紹介した split() のパターンを一覧でまとめます。

パターン コード例 用途
文字列で分割 str.split(",") CSV、カンマ区切りなど
正規表現で分割 str.split(/[,;\s]/) 複数の区切り文字に対応
連続空白で分割 str.split(/\s+/) 不定数の空白をまとめて分割
分割数を制限 str.split(",", 3) 先頭N個のみ取得
区切り文字を残す str.split(/([+\-*])/) トークン分割・数式パース
1文字ずつ分割 str.split("") 文字列の反転・文字操作
改行で分割 str.split(/\r?\n|\r/) テキストの行分割(OS混在対応)
split + map str.split(",").map(Number) 文字列→数値配列への変換
split + filter str.split(",").filter(Boolean) 空要素の除去
split + join str.split("_").join("-") 区切り文字の変換

まとめ

JavaScriptのsplit()メソッドは、文字列処理の中で最もよく使うメソッドの一つです。この記事のポイントをおさらいしましょう。

この記事のまとめ

  • split(separator, limit) で文字列を配列に分割できる
  • 区切り文字には文字列正規表現の両方が使える
  • /[,;\s]/ のように複数の区切り文字を同時に指定可能
  • 第2引数 limit で分割数を制限できる
  • キャプチャグループ () を使うと区切り文字を結果に残せる
  • split("") で1文字ずつ分割(サロゲートペアには [...str] を使う)
  • split + map/filter/reduce の組み合わせで高度な文字列処理が可能
  • join() で逆変換(配列→文字列)ができる
  • URL解析・パス分割・クエリ解析など実務で幅広く活用できる