なぜ「改行除去」ユーティリティが必要になるのか
業務システムでユーザー入力を扱っていると、テキストエリアからの入力や、外部システムからのデータに「改行」が普通に混ざります。
見た目としては問題なくても、次のような場面で困り始めます。
検索条件に使いたいのに、改行が入っていてヒットしない。
CSV に出したら、1レコードの途中で改行されてファイルが壊れる。
ログに出したら、1行のつもりが複数行になって読みづらい。
こういうときに使うのが 「改行除去ユーティリティ」 です。
「改行を全部消す」「改行をスペースに変える」など、ルールを決めて一箇所にまとめておくと、コードがかなりスッキリします。
改行コードの種類をざっくり理解する
実は「改行」は1種類じゃない
改行は、環境によって表現が違います。
"\n" … LF(Line Feed)Unix / macOS / 多くのWeb"\r\n" … CRLF(Carriage Return + Line Feed)Windows"\r" … CR(Carriage Return)古い Mac など
実務では、外部システムやファイル経由で、これらが混在していることもあります。
なので、「改行を消したい」ときは、これら全部を対象にするのが安全です。
改行を「全部消す」ユーティリティ
一番シンプルな実装
まずは、「改行を完全に取り除く」バージョンです。
function removeNewlines(value) {
if (value == null) return "";
return String(value).replace(/\r?\n/g, "");
}
JavaScriptここでのポイントを噛み砕きます。
value が null / undefined でも落ちないようにしている。String(value) で文字列に変換してから処理している。/\r?\n/g は「\n の前に \r があってもなくてもOK」という意味。
つまり、\n と \r\n の両方を一気に消している。
これで、よくある改行はほぼカバーできます。
具体例
removeNewlines("あいうえお\nかきくけこ");
// "あいうえおかきくけこ"
removeNewlines("行1\r\n行2\r\n行3");
// "行1行2行3"
JavaScript「とにかく1行にしたい」「改行があると困るフォーマットに流したい」ときに、そのまま使えます。
改行を「スペースに変える」ユーティリティ
消すのではなく「つなげ方」をコントロールする
改行を完全に消すと、単語や文がくっつきすぎて読みにくくなることがあります。
"山田太郎
東京都中央区"
→ "山田太郎東京都中央区"
これだと、どこで区切れていたのか分かりづらいですよね。
そこで、「改行をスペースに置き換える」パターンもよく使います。
function replaceNewlinesWithSpace(value) {
if (value == null) return "";
return String(value).replace(/\r?\n/g, " ");
}
JavaScript具体例
replaceNewlinesWithSpace("山田太郎\n東京都中央区");
// "山田太郎 東京都中央区"
replaceNewlinesWithSpace("行1\r\n行2\r\n行3");
// "行1 行2 行3"
JavaScript「1行にしたいけれど、元の区切り感は残したい」というときに便利です。
もう一歩丁寧に:連続する空白も整える
改行→スペースのあとに「空白を整理する」
改行をスペースに変えると、場所によってはスペースが連続することがあります。
" 行1\n\n行2 "
→ " 行1 行2 "
これをそのまま使うと、見た目が少し気持ち悪いので、
「連続する空白を1個にまとめる」処理を足すことが多いです。
function normalizeNewlinesToSpace(value) {
if (value == null) return "";
return String(value)
.replace(/\r?\n/g, " ") // 改行をスペースに
.replace(/\s+/g, " ") // 連続する空白を1個に
.trim(); // 前後の空白を削る
}
JavaScript具体例
normalizeNewlinesToSpace(" 山田太郎\n\n東京都中央区 ");
// "山田太郎 東京都中央区"
normalizeNewlinesToSpace("行1\r\n 行2\r\n\r\n行3");
// "行1 行2 行3"
JavaScriptここまでやると、「人間が読むテキスト」としてかなり自然になります。
業務での具体的な使いどころ
CSV や TSV に出力するとき
CSV は「1行=1レコード」が前提なので、
項目の中に改行が入っていると、解析側が壊れることがあります。
function sanitizeForCsvField(value) {
return normalizeNewlinesToSpace(value);
}
JavaScriptこれを通してから CSV に流すだけで、
「途中で行が分かれてしまう」事故をかなり防げます。
ログ出力を1行にそろえたいとき
ログも「1行=1イベント」として扱うことが多いです。
メッセージに改行が入っていると、ログビューアで見づらくなります。
function oneLineLogMessage(message) {
return normalizeNewlinesToSpace(message);
}
JavaScriptこれを通してからログに出すと、
「1イベントが複数行にまたがる」問題を避けられます。
検索条件やキーとして使うとき
改行が混ざった文字列を、そのまま検索条件やキーに使うと、
「見た目は同じなのにヒットしない」ということが起きます。
検索前に
const normalized = normalizeNewlinesToSpace(userInput);
JavaScriptのように一度整えておくと、
「改行の有無の違い」に悩まされにくくなります。
設計として意識してほしいこと
「どう整えたいか」をユーティリティに閉じ込める
改行除去は、実は「仕様」がいくつかあります。
完全に消したいのか。
スペースにしたいのか。
スペースにしたうえで、連続空白もまとめたいのか。
これをその場その場でバラバラに書き始めると、
画面ごと・機能ごとに挙動が微妙に違ってきます。
なので、
export function removeNewlines(value) { ... }
export function replaceNewlinesWithSpace(value) { ... }
export function normalizeNewlinesToSpace(value) { ... }
JavaScriptのように、目的ごとに名前を付けたユーティリティにしておくと、
「この処理はどういう意図で改行を扱っているのか」が一目で分かるようになります。
「どのタイミングで改行を処理するか」を決める
入力直後に改行を消すのか。
保存前に整形するのか。
出力前だけ整形するのか。
これはシステムごとに設計が分かれますが、
大事なのは「どこでやるかを決めて、ブレさせない」ことです。
個人的なおすすめは、
保存するデータは「元の入力をなるべくそのまま持つ」。
CSV やログなど「フォーマットの制約があるところ」に出す直前で整形する。
という方針です。
こうしておくと、「元の入力がどうだったか」を後から確認しやすくなります。
ちょっとだけ手を動かしてみる
コンソールで、次のあたりを試してみてください。
removeNewlines("行1\n行2\n行3");
replaceNewlinesWithSpace("行1\n\n行2");
normalizeNewlinesToSpace(" 山田太郎\n\n東京都中央区 ");
JavaScript「どこまでが消えて、どこまでがスペースになって、どこまでが整えられるか」を目で確認すると、
改行除去のイメージがかなりクリアになります。
そのうえで、自分のプロジェクトに
export function removeNewlines(value) { ... }
export function normalizeNewlinesToSpace(value) { ... }
JavaScriptのようなユーティリティを一つ置いて、
「改行をいじりたいときは必ずここを通す」
というルールにしてみてください。
それができた瞬間、あなたの文字列処理は
「その場しのぎで改行を replace している状態」から
「意図を持って設計された改行整形ユーティリティ」を持つ状態に、一段レベルアップします。
