【JavaScript】改行の削除・置換・追加方法まとめ|改行コードの違いと実務パターン

JavaScriptで文字列中の改行を削除したい、あるいは改行を別の文字に置換したいといった場面は、フォーム入力の正規化やCSVデータの加工など実務で頻繁に発生します。

しかし、改行コードには
(LF)、
(CR)、
(CRLF)の3種類があり、環境によって異なるため、正しく処理しないと改行が残ってしまうトラブルが起きがちです。

この記事では、改行コードの基礎知識から、改行の削除・置換・追加・挿入の各テクニック、テキストエリアの改行処理実務で使えるパターン集よくあるミスと注意点まで網羅的に解説します。

この記事で学べること

  • 改行コード(
    /
    /
    )の種類と違い
  • replace() + 正規表現で改行を全て削除する方法
  • split() + join() / replaceAll() による削除
  • 改行をスペース・<br>タグ・カンマに置換する方法

  • ・テンプレートリテラル・join()改行を追加する方法
  • テキストエリアの改行を取得・表示する実践テクニック
  • CSV分割・ログ処理・クリップボード正規化などの実務パターン
  • CRLF未対応・JSON改行エスケープなどのよくあるミス
スポンサーリンク

改行コードの種類と違い

改行処理を正しく行うためには、まず改行コードの種類を理解しておく必要があります。改行コードはOS・環境によって異なるため、1つだけを対象にすると取りこぼしが発生します。

3種類の改行コード

改行コード エスケープ表記 名称 使用OS・環境
LF
Line Feed macOS / Linux / Unix
CR
Carriage Return 古いMac OS(OS 9以前)
CRLF
CR + LF Windows

ポイント:Webブラウザ上のJavaScriptでは
(LF)が主流ですが、サーバーから受け取ったデータやファイルアップロードの内容には
(CRLF)が混在することがあります。そのため、すべての改行コードを考慮した正規表現で処理するのが安全です。

改行コードを確認するコード

文字列にどの改行コードが含まれているかは、以下のように確認できます。

JavaScript
const text = "Hello
World
Foo
Bar";

// CRLF を含むか
console.log(text.includes("
")); // true

// LF を含むか
console.log(text.includes("
"));   // true

// CR を含むか
console.log(text.includes("
"));   // true

// 各改行コードの出現回数
const crlfCount = (text.match(/
/g) || []).length;
const lfCount = (text.match(/(?) || []).length;
const crCount = (text.match(/
(?!
)/g) || []).length;

console.log(`CRLF: ${crlfCount}, LF: ${lfCount}, CR: ${crCount}`);
// CRLF: 1, LF: 1, CR: 1
実行結果
true
true
true
CRLF: 1, LF: 1, CR: 1

改行を全て削除する方法

文字列からすべての改行コードを取り除くには、いくつかのアプローチがあります。ここでは代表的な3つの方法を紹介します。

方法1: replace() + 正規表現(推奨)

最も汎用的で確実な方法は、replace()に正規表現 /
?
|
/g
を渡す方法です。この正規表現は LF・CR・CRLF のすべてにマッチします。

JavaScript
const text = "1行目
2行目
3行目
4行目";

// すべての改行コードを削除
const result = text.replace(/
?
|
/g, "");

console.log(result);
// "1行目2行目3行目4行目"
実行結果
1行目2行目3行目4行目

正規表現 /\r?\n|\r/g の仕組み

パターン マッチ対象 説明
\r?\n CRLF または LF \r は0回または1回 + \n
| OR(どちらかにマッチ)
\r CR のみ 上記でマッチしなかった単独の \r
g フラグ 全マッチ 文字列中のすべての改行を対象にする

ポイント:この正規表現はすべてのOS環境の改行コードに対応しています。/\n/g だけではWindowsの \r\n\r が残ってしまうため、/\r?\n|\r/g を使うのがベストプラクティスです。

方法2: split() + join()

split() で改行位置で分割し、join() で空文字で結合する方法です。正規表現を使って分割することで、すべての改行コードに対応できます。

JavaScript
const text = "りんご
バナナ
みかん
ぶどう";

// 正規表現で分割 → 空文字で結合
const result = text.split(/
?
|
/).join("");

console.log(result);
// "りんごバナナみかんぶどう"
実行結果
りんごバナナみかんぶどう

split() + join() は、改行を削除するだけでなく、別の文字に置き換えるときにも直感的に使えるので便利です(後述)。

方法3: replaceAll()(ES2021)

ES2021で追加された replaceAll() を使うと、文字列を指定して全置換できます。ただし、文字列引数の場合は1種類の改行コードしか指定できない点に注意が必要です。

JavaScript
const text = "AAA
BBB
CCC";

// replaceAll() で LF を削除
const result = text.replaceAll("
", "");

console.log(result);
// "AAABBBCCC"
実行結果
AAABBBCCC

注意:replaceAll() に文字列を渡した場合、その文字列に完全一致するものだけが置換対象になります。
(CRLF)を含む文字列を処理するには、先に replaceAll("
", "")
→ 次に replaceAll("
", "")
→ 最後に replaceAll("
", "")
とチェーンする必要があります。

replaceAll() に正規表現を渡すこともできます。その場合は replace() + /g フラグと同じ動作になります。

JavaScript
// replaceAll() + 正規表現(g フラグ必須)
const text = "A
B
C
D";
const result = text.replaceAll(/
?
|
/g, "");

console.log(result); // "ABCD"

3つの方法の比較

方法 全改行コード対応 ブラウザ対応 おすすめ度
replace(/\r?\n|\r/g, "") 対応 全ブラウザ ★★★(推奨)
split(/\r?\n|\r/).join("") 対応 全ブラウザ ★★☆
replaceAll("\n", "") LF のみ ES2021+ ★☆☆

改行を別の文字に置換する方法

改行を削除するのではなく、別の文字や文字列に変換したいケースも多くあります。ここでは実務でよく使うパターンを紹介します。

改行をスペースに置換する

複数行のテキストを1行にまとめつつ、単語の区切りを保持したい場合に使います。

JavaScript
const text = "JavaScript is
a versatile
language";

// 改行をスペースに置換
const result = text.replace(/
?
|
/g, " ");

console.log(result);
// "JavaScript is a versatile language"
実行結果
JavaScript is a versatile language

改行を <br> タグに変換する(nl2br)

PHPの nl2br() と同等の処理をJavaScriptで実現する方法です。ユーザーが入力した改行をHTMLとして表示するときに使います。

JavaScript
// nl2br: 改行を <br> タグに変換
function nl2br(str) {
  return str.replace(/
?
|
/g, "<br>");
}

const text = "こんにちは
今日は良い天気ですね
また会いましょう";

console.log(nl2br(text));
// "こんにちは<br>今日は良い天気ですね<br>また会いましょう"
実行結果
こんにちは<br>今日は良い天気ですね<br>また会いましょう

セキュリティ注意:ユーザー入力を innerHTML で表示する場合は、先にHTMLエスケープしてから nl2br() を適用しましょう。そうしないとXSS(クロスサイトスクリプティング)の脆弱性につながります。

安全な nl2br 実装は以下のようになります。

JavaScript
// 安全な nl2br(HTMLエスケープ付き)
function safeNl2br(str) {
  return str
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/
?
|
/g, "<br>");
}

const userInput = "<script>alert(1)</script>
Hello";
document.getElementById("output").innerHTML = safeNl2br(userInput);
// &lt;script&gt;alert(1)&lt;/script&gt;<br>Hello

改行をカンマ区切りに変換する

1行ずつ入力されたデータをカンマ区切り(CSV形式)に変換するパターンです。split() + join() が直感的です。

JavaScript
const text = "東京
大阪
名古屋
福岡";

// 改行をカンマに変換
const csv = text.split(/
?
|
/).join(",");

console.log(csv);
// "東京,大阪,名古屋,福岡"
実行結果
東京,大阪,名古屋,福岡

filter() を挟むと空行を除外できます。

JavaScript
const text = "東京

大阪

名古屋";

// 空行を除外してカンマ区切りに
const csv = text
  .split(/
?
|
/)
  .filter(line => line.trim() !== "")
  .join(",");

console.log(csv);
// "東京,大阪,名古屋"

改行を追加・挿入する方法

逆に、文字列に改行を追加したい場合のテクニックを紹介します。

\n で文字列に改行を追加する

最もシンプルな方法は、文字列連結で \n を挿入する方法です。

JavaScript
// 文字列連結で改行を追加
const line1 = "Hello";
const line2 = "World";
const text = line1 + "
" + line2;

console.log(text);
// Hello
// World
実行結果
Hello
World

テンプレートリテラルで改行を含む文字列を作る

ES2015のテンプレートリテラル(バッククォート)を使えば、コード上の改行がそのまま文字列中の改行になります。

JavaScript
const message = `1行目
2行目
3行目`;

console.log(message);
// 1行目
// 2行目
// 3行目

ポイント:テンプレートリテラル内の改行は \n(LF)として扱われます。変数展開(${})も使えるので、動的な複数行テキストの生成に最適です。

配列.join(\n) で複数行テキストを作る

配列の要素を \n で結合すると、改行区切りのテキストが作れます。行の追加・削除・並べ替えが容易なので、動的に行を組み立てる場合に便利です。

JavaScript
const lines = [
  "名前: 田中太郎",
  "年齢: 30",
  "職業: エンジニア",
];

const text = lines.join("
");

console.log(text);
// 名前: 田中太郎
// 年齢: 30
// 職業: エンジニア
実行結果
名前: 田中太郎
年齢: 30
職業: エンジニア

文字列の特定位置に改行を挿入する

既存の文字列の特定の位置(例: 指定文字数ごと)に改行を挿入したい場合は、正規表現の .{n} を使います。

JavaScript
// n文字ごとに改行を挿入
function insertNewlineEvery(str, n) {
  return str.match(new RegExp(`.{1,${n}}`, "g")).join("
");
}

const text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

console.log(insertNewlineEvery(text, 10));
// ABCDEFGHIJ
// KLMNOPQRST
// UVWXYZ
実行結果
ABCDEFGHIJ
KLMNOPQRST
UVWXYZ

テキストエリアの改行処理

HTMLの <textarea> に入力されたテキストには改行が含まれます。この改行をJavaScriptで正しく扱う方法を解説します。

textarea の値から改行を取得する

textarea.value で取得した文字列には、ユーザーがEnterキーで入力した改行が \n(LF)として含まれます。

HTML + JavaScript
<!-- HTML -->
<textarea id="myTextarea"></textarea>
<button onclick="processText()">処理</button>

<!-- JavaScript -->
<script>
function processText() {
  const textarea = document.getElementById("myTextarea");
  const text = textarea.value;

  // 行ごとに分割
  const lines = text.split("
");
  console.log("行数:", lines.length);
  console.log("各行:", lines);

  // 改行を削除して1行に
  const oneLine = text.replace(/
/g, "");
  console.log("1行:", oneLine);
}
</script>

補足:HTML仕様(WHATWG)では、textarea.value の改行は常に \n(LF)に正規化されると定められています。そのため、ブラウザ上のtextareaからの入力であれば /\n/g だけで十分です。

HTMLで改行を表示する方法

textarea から取得した改行をHTMLとして表示するには、いくつかのアプローチがあります。

方法1: white-space: pre-line を使う

CSSの white-space: pre-line を使えば、HTMLエンティティを変換せずに改行をそのまま反映できます。XSSのリスクもなく、最も安全な方法です。

HTML + JavaScript
<div id="output" style="white-space: pre-line;"></div>

<script>
const text = "1行目
2行目
3行目";

// textContent を使えば HTMLエスケープ不要
document.getElementById("output").textContent = text;
</script>

方法2: <br> タグに変換して innerHTML で表示

先ほど紹介した nl2br()<br> タグに変換してから innerHTML で表示します。

JavaScript
const text = "1行目
2行目
3行目";

// 安全に変換(HTMLエスケープ + nl2br)
const safe = text
  .replace(/&/g, "&amp;")
  .replace(/</g, "&lt;")
  .replace(/>/g, "&gt;")
  .replace(/
/g, "<br>");

document.getElementById("output").innerHTML = safe;

2つの表示方法の比較

方法 XSS安全性 実装の手軽さ HTML混在
textContent + pre-line 安全 簡単 不可
innerHTML + nl2br エスケープ必須 やや手間 可能

実務でよく使うパターン

ここからは、改行処理が実務でどのように使われるかを具体的な例で紹介します。

CSVデータの行分割

CSVファイルの内容を行ごとに分割し、各行をカンマでさらに分割して2次元配列にするパターンです。

JavaScript
const csvData = "名前,年齢,職業
田中,30,エンジニア
鈴木,25,デザイナー
佐藤,35,マネージャー";

// 行分割 → 各行をカンマ分割
const rows = csvData
  .split(/
?
|
/)
  .map(row => row.split(","));

// ヘッダーとデータに分離
const [header, ...data] = rows;

console.log("ヘッダー:", header);
console.log("データ:", data);
実行結果
ヘッダー: ["名前", "年齢", "職業"]
データ: [
  ["田中", "30", "エンジニア"],
  ["鈴木", "25", "デザイナー"],
  ["佐藤", "35", "マネージャー"]
]

ログの行ごと処理

複数行のログテキストを行ごとに解析し、特定の条件でフィルタリングするパターンです。

JavaScript
const logText = `[INFO] サーバー起動
[ERROR] DB接続失敗
[INFO] リトライ中
[ERROR] タイムアウト
[INFO] 復旧完了`;

// ERROR行だけ抽出
const errors = logText
  .split("
")
  .filter(line => line.includes("[ERROR]"));

console.log(errors);
// ["[ERROR] DB接続失敗", "[ERROR] タイムアウト"]

// エラー数をカウント
console.log(`エラー件数: ${errors.length}件`);
// "エラー件数: 2件"
実行結果
["[ERROR] DB接続失敗", "[ERROR] タイムアウト"]
エラー件数: 2件

クリップボードのテキスト正規化

クリップボードから貼り付けたテキストは、OSやアプリによって改行コードが異なることがあります。正規化して統一するパターンです。

JavaScript
// 改行コードを LF に統一する関数
function normalizeNewlines(str) {
  return str.replace(/
/g, "
").replace(/
/g, "
");
}

// クリップボードイベントで使う例
document.addEventListener("paste", (e) => {
  e.preventDefault();
  const rawText = e.clipboardData.getData("text/plain");
  const normalized = normalizeNewlines(rawText);
  console.log(normalized);
});

ポイント:改行コードの正規化は、CRLF → LF の順で置換するのが重要です。先に \r だけ削除すると、CRLF が \n だけになるのは良いですが、\r\n\n\n のように改行が2つに増えるバグにはなりません。ただし、順序を意識して書くのがベストプラクティスです。

改行数のカウント

テキスト中の改行数(=行数 – 1)をカウントする方法です。

JavaScript
// 改行数をカウント
function countNewlines(str) {
  const matches = str.match(/
?
|
/g);
  return matches ? matches.length : 0;
}

// 行数をカウント(改行数 + 1)
function countLines(str) {
  return str.split(/
?
|
/).length;
}

const text = "1行目
2行目
3行目
4行目";

console.log("改行数:", countNewlines(text)); // 3
console.log("行数:", countLines(text));    // 4
実行結果
改行数: 3
行数: 4

よくあるミスと注意点

改行処理でハマりやすいポイントをまとめます。これらを知っておくことで、デバッグの時間を大幅に短縮できます。

/\n/g だけでは CRLF を完全に処理できない

最もよくあるミスです。/\n/g は LF にしかマッチしないため、CRLF の \r が残ります。

JavaScript
const text = "Hello
World";

// NG: \n だけ削除 → \r が残る
const bad = text.replace(/
/g, "");
console.log(bad);             // "Hello\rWorld" ← \r が残っている!
console.log(bad.length);      // 11(\r の分が残る)

// OK: すべての改行コードに対応
const good = text.replace(/
?
|
/g, "");
console.log(good);            // "HelloWorld"
console.log(good.length);     // 10
実行結果
Hello\rWorld
11
HelloWorld
10

JSON.stringify() での改行エスケープ

JSON.stringify() は文字列中の改行を自動的にエスケープ(\n\\n)します。JSONとしては正しい動作ですが、知らないと混乱することがあります。

JavaScript
const text = "Hello
World";

// console.log では改行される
console.log(text);
// Hello
// World

// JSON.stringify() ではエスケープされる
console.log(JSON.stringify(text));
// "Hello\nWorld" ← \n が文字列として表示される

// JSON.parse() で元に戻る
const parsed = JSON.parse(JSON.stringify(text));
console.log(parsed === text); // true

補足:APIにJSONで送信するデータに改行が含まれる場合は、JSON.stringify() が自動的にエスケープしてくれるため、手動で \n\\n に変換する必要はありません。

innerHTML と textContent の改行の扱いの違い

innerHTMLtextContent では、改行の扱いがまったく異なります。

JavaScript
const div = document.getElementById("output");
const text = "Hello
World";

// innerHTML: \n は空白として扱われる(改行されない)
div.innerHTML = text;
// 表示: "Hello World"(スペースに見える)

// textContent: \n はそのまま保持される
div.textContent = text;
// 表示: "Hello World"(改行されない、white-space:normalの場合)

// textContent + white-space:pre-line で改行が反映される
div.style.whiteSpace = "pre-line";
div.textContent = text;
// 表示: "Hello" と "World" が別の行に
プロパティ 改行の扱い HTMLタグ XSS
innerHTML 空白として折りたたまれる 解釈される 脆弱性あり
textContent 保持される(CSSで制御) テキストとして表示 安全

replace() の g フラグを忘れると1つしか置換されない

replace() に正規表現を渡す際、g(グローバル)フラグを付け忘れると、最初の1つしか置換されません

JavaScript
const text = "A
B
C";

// NG: g フラグなし → 最初の \n だけ置換
console.log(text.replace(/
/, ""));
// "AB\nC" ← 2つ目の \n が残る

// OK: g フラグあり → すべて置換
console.log(text.replace(/
/g, ""));
// "ABC"

まとめ

この記事では、JavaScriptにおける改行コードの基礎知識から、改行の削除・置換・追加、テキストエリア処理、実務パターン、よくあるミスまでを解説しました。

パターン別早見表

やりたいこと コード
改行を全て削除 str.replace(/\r?\n|\r/g, "")
改行をスペースに str.replace(/\r?\n|\r/g, " ")
改行を <br> に str.replace(/\r?\n|\r/g, "<br>")
改行をカンマに str.split(/\r?\n|\r/).join(",")
改行で分割(配列化) str.split(/\r?\n|\r/)
配列を改行で結合 arr.join("\n")
改行コードを LF に統一 str.replace(/\r\n/g, "\n").replace(/\r/g, "\n")
改行数のカウント (str.match(/\r?\n|\r/g) || []).length
行数のカウント str.split(/\r?\n|\r/).length

覚えておくべき3つのポイント

  1. 改行コードは \n(LF)、\r(CR)、\r\n(CRLF)の3種類。正規表現 /\r?\n|\r/g ですべて対応できる
  2. replace() に正規表現を使う場合はg フラグを必ず付ける(付けないと最初の1つしか置換されない)
  3. ユーザー入力をHTMLに表示するときは textContent + white-space: pre-line が最も安全

改行処理は一見シンプルですが、改行コードの違いやセキュリティの考慮など、注意すべきポイントがいくつもあります。この記事で紹介したパターンを活用して、確実な改行処理を実装してください。