【JavaScript】文字列内の改行を削除または統一する方法
更新日:2023/04/20
ファイルから読み込むなどの方法で外部から取得した文字列データは改行コードが不確定なことが多いです。
そのため、まずは改行を削除したり統一するなどの処理が求められます。
そこで今回は、JavaScriptで文字列内の改行の削除および統一する方法をお伝えします。
改行文字の種類
改行文字は全部で3種類あります。
"\r\n" "\n" "\r"
"\r"は現在ではほとんど使われていませんが一応対応しておきます。
削除と統一は、この3つのコードを正規表現でマッチさせて、空白または統一後の改行文字で置き換えればOKです。
今回はテストのために、次のような文字列を作成しました。
const text = "今日は\r\n朝から\n雨だったので\r傘を指して出かけた。";
console.log( text );
// 結果:
// 今日は
// 朝から
// 雨だったので傘を指して出かけた。
ブラウザのコンソールは、"\r"を認識しませんでした。
そして、Node.jsで実行すると次のようになります。
// 今日は
// 朝から
// 傘を指して出かけた。
"\r"は左に移動という意味があります。
まず"雨だったので"を出力した後に左側(行頭)に戻って、"傘を指して出かけた。"を出力したのです。
環境によっては、改行は"\r"以外のものに統一しておかないと、少々まずいケースがありますね。
改行にマッチする正規表現
3つの改行にマッチする正規表現は、次のようなものになります。
/\r?\n|\r/
? は直前の文字を 0回または1回繰り返すという意味です。
そのため \r?\n は、"\n" (0回繰り返し)または "\r\n" (1回繰り返し)の二つにマッチします。
| は"または"という意味です。
\r?\n または \r となり、3つの改行文字にマッチします。
改行を削除する方法
改行の削除は、改行に一致する正規表現を使って空文字("")に置き換えます。
const t = text.replace( /\r?\n|\r/g , "");
console.log( t );
// 結果: 今日は朝から雨だったので傘を指して出かけた。
gフラグを使用しないと最初に一致したもののみが置換されます。
忘れないようにしましょう。
改行を統一する方法
改行の統一は、削除と同じように統一したい改行文字で置き換えます。
const t = text.replace( /\r?\n|\r/g , "\n");
console.log( t );
// 結果:
// 今日は
// 朝から
// 傘を指して
// 出かけた。
元データをブラウザで出力すると"\r"を認識してくれませんでした。
"\n"に統一したので、今度は認識してくれました。
気づいている人もいると思いますが、上のコードは効率が悪いです。
なぜなら、"\n"を"\n"に置換しているからです。
内部処理では置き換えていない可能性がありますが、検索している時点で不効率ですね。
そこで、統一後以外の改行文字のみをマッチさせます。
"\n"に統一する場合は次のようになります。
"\n"に統一する場合
const t = text.replace( /\r\n|\r/g , "\n");
"\r\n"の統一は少し難しいです。
単純に上の方法を流用すると "\r\n" を置き換えて"\r\n\r\n"になってしまうので、先読みとか後読みとかを駆使する必要があります。
"\r\n"に統一する場合
const t = text.replace( /(?<!\r)\n|\r(?!\n)/g , "\r\n");
ここまでやると、最初の方法の方が効率的かもしれませんね。
"\r\n"に統一する場合その2
const t = text.replace( /\r?\n|\r/g , "\r\n");
実際には、大量の文書を処理するのでなければ処理時間の差は気にならないレベルです。
どちらでもいいですね。
更新日:2023/04/20
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。