JavaScript Tips | 文字列ユーティリティ:検索・置換 - 改行除去

JavaScript JavaScript
スポンサーリンク

なぜ「改行除去」ユーティリティが必要になるのか

業務システムでユーザー入力を扱っていると、テキストエリアからの入力や、外部システムからのデータに「改行」が普通に混ざります。
見た目としては問題なくても、次のような場面で困り始めます。

検索条件に使いたいのに、改行が入っていてヒットしない。
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

ここでのポイントを噛み砕きます。

valuenull / 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 している状態」から
「意図を持って設計された改行整形ユーティリティ」を持つ状態に、一段レベルアップします。

タイトルとURLをコピーしました