【JavaScript】改行を削除・置換する方法

テキストの整形では、文字列内の改行を削除したり、スペースやカンマなど別の文字に置換したりする場面がよくあります。JavaScriptでは replace() +正規表現で行います。

ポイントは、改行に \n(LF)・\r\n(CRLF)・\r(CR)の複数の形式があること、そして「連続した改行をまとめるか、1つずつ置換するか」で正規表現が変わることです。

この記事の結論:改行の削除は str.replace(/[\r\n]+/g, "")、置換は第2引数を変えるだけです。連続改行をまとめて置換するなら [\r\n]+1つずつ置換するなら \r\n|\r|\n を使い分けます。
スポンサーリンク

改行を削除する

改行を削除するには、改行文字を空文字に置換します。[\r\n]+ とすることで \n\r\n\r のすべての改行をまとめて対象にできます。

JavaScript:改行を削除
const text = "Hello\nWorld!\r\nThis is a test.";

const result = text.replace(/[\r\n]+/g, ""); // すべての改行を削除
console.log(result); // "HelloWorld!This is a test."

g フラグは「すべての一致」を置換する指定です。これが無いと最初の1つしか置換されません。

別の文字に置換する(スペース・カンマなど)

第2引数を変えれば、改行を好きな文字に置換できます。1行のテキストにしたいときはスペース、CSV風にしたいときはカンマ、といった具合です。

JavaScript:スペースやカンマに置換
const text = "Hello\nWorld!\r\nThis is a test.";

// 改行をスペースに
text.replace(/[\r\n]+/g, " ");  // "Hello World! This is a test."

// 改行をカンマに
text.replace(/[\r\n]+/g, ", "); // "Hello, World!, This is a test."

「まとめて」か「1つずつ」か(重要)

ここが見落としやすいポイントです。連続した改行を1回にまとめて置換するか、1つずつ置換するかで正規表現が変わります。

JavaScript:まとめる vs 1つずつ
const s = "a\n\nb"; // 改行が2つ

// [\r\n]+ : 連続改行をまとめて1回置換
s.replace(/[\r\n]+/g, "-");   // "a-b"

// \r\n|\r|\n : 改行を1つずつ置換
s.replace(/\r\n|\r|\n/g, "-"); // "a--b"
使い分け:改行を <br> などに1対1で置換したいときは、まとめてしまう [\r\n]+ ではなく \r\n|\r|\n を使います。(\r\n| の先頭に置くのは、CRLFを2回置換しないためです。)

連続する空行をまとめる・前後の空白を削る

段落の余白を整えたいときは、連続する改行を1つにまとめます。改行の前後にある余分なスペース・タブを削るのもテキスト正規化でよく使います。

JavaScript:空行のまとめ・前後トリム
// 2つ以上の連続改行を1つにまとめる
"a\n\n\nb".replace(/\n{2,}/g, "\n"); // "a\nb"

// 改行の前後のスペース・タブを削る
"a \n  b".replace(/[\t ]*\r?\n[\t ]*/g, "\n"); // "a\nb"

空白だけの文字列かどうかの判定(trim() など)は空文字列の判定方法も参考になります。

replaceAllを使うときの注意

replaceAll() でも置換できますが、文字列を渡すとその文字だけが対象になります。"\n" だけ指定すると \r が残るので注意してください。

JavaScript:replaceAllの落とし穴
// NG: "\n" だけ消すと \r が残る
"a\r\nb".replaceAll("\n", ""); // "a\rb" ← \r が残る

// OK: すべての改行を消すなら正規表現で(gフラグ必須)
"a\r\nb".replaceAll(/[\r\n]+/g, ""); // "ab"

replaceAll に正規表現を渡す場合は g フラグが必須です(無いとエラーになります)。replace / replaceAll の使い分けはreplace()で文字列を置換する方法で詳しく解説しています。

改行を<br>タグに変換したいとき

改行を画面上の改行(<br>)として表示したい場合は、削除ではなく <br> への置換になります。ただしユーザー入力をそのままHTMLにするとXSSの危険があるため、エスケープなどの対策が必要です。詳しくは改行を<br>タグに変換する方法で解説しています(このとき改行は1対1で置換するため \r\n|\r|\n を使います)。

よくある質問(FAQ)

QJavaScriptで文字列から改行を削除するには?
Areplace(/[\r\n]+/g, "")\n\r\n\r のすべての改行を削除できます。Unix改行だけなら replace(/\n/g, "") でも構いません。
Q複数の連続した改行を1つにまとめるには?
Areplace(/\n{2,}/g, "\n") で2回以上の連続改行を1つにまとめられます。段落間の余白を整えるテキスト処理などによく使われます。
Q改行を1つずつ別の文字に置換したいのですが?
A[\r\n]+ は連続改行をまとめてしまうため、1対1で置換するならreplace(/\r\n|\r|\n/g, "置換文字") を使います。改行を <br> に変換する場合などはこちらが必要です。
QreplaceAllで改行を消すと一部残るのはなぜ?
AreplaceAll("\n", "") のように文字列を渡すと、その文字だけが対象になり \r が残ります。すべての改行を消すには replaceAll(/[\r\n]+/g, "") のように正規表現(gフラグ必須)を使ってください。

まとめ

改行の削除・置換は replace() +正規表現で行います。削除は replace(/[\r\n]+/g, "")、置換は第2引数を変えるだけです。改行には \n\r\n\r の形式があるので、まとめて対象にできる [\r\n] が便利です。

大切なのは、連続改行を「まとめる([\r\n]+)」か「1つずつ(\r\n|\r|\n)」かを用途で選ぶこと、そして replaceAll に文字列を渡すと一部の改行が残る点です。正しい正規表現を選んで、思いどおりにテキストを整形しましょう。