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行目"
正規表現 /\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"
注意: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, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/
?
|
/g, "<br>");
}
const userInput = "<script>alert(1)</script>
Hello";
document.getElementById("output").innerHTML = safeNl2br(userInput);
// <script>alert(1)</script><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
テンプレートリテラルで改行を含む文字列を作る
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, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.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
よくあるミスと注意点
改行処理でハマりやすいポイントをまとめます。これらを知っておくことで、デバッグの時間を大幅に短縮できます。
/\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 の改行の扱いの違い
innerHTML と textContent では、改行の扱いがまったく異なります。
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つのポイント
- 改行コードは
\n(LF)、\r(CR)、\r\n(CRLF)の3種類。正規表現 /\r?\n|\r/g ですべて対応できる
replace() に正規表現を使う場合はg フラグを必ず付ける(付けないと最初の1つしか置換されない)
- ユーザー入力をHTMLに表示するときは
textContent + white-space: pre-line が最も安全
改行処理は一見シンプルですが、改行コードの違いやセキュリティの考慮など、注意すべきポイントがいくつもあります。この記事で紹介したパターンを活用して、確実な改行処理を実装してください。