テキストの整形では、文字列内の改行を削除したり、スペースやカンマなど別の文字に置換したりする場面がよくあります。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 のすべての改行をまとめて対象にできます。
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風にしたいときはカンマ、といった具合です。
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つずつ置換するかで正規表現が変わります。
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つにまとめます。改行の前後にある余分なスペース・タブを削るのもテキスト正規化でよく使います。
// 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 が残るので注意してください。
// 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)
replace(/[\r\n]+/g, "") で \n・\r\n・\r のすべての改行を削除できます。Unix改行だけなら replace(/\n/g, "") でも構いません。replace(/\n{2,}/g, "\n") で2回以上の連続改行を1つにまとめられます。段落間の余白を整えるテキスト処理などによく使われます。[\r\n]+ は連続改行をまとめてしまうため、1対1で置換するならreplace(/\r\n|\r|\n/g, "置換文字") を使います。改行を <br> に変換する場合などはこちらが必要です。replaceAll("\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 に文字列を渡すと一部の改行が残る点です。正しい正規表現を選んで、思いどおりにテキストを整形しましょう。

