正規表現:改行コードの表現方法。置換による削除

最終更新:2023-09-01 by Joe

正規表現で、改行コードの表現方法と、改行コードにまつわる置換や削除の操作をまとめました。

「改行コード」の正規表現

「改行」は、特定の文字コードで記述された「制御文字」の1つですので、通常のテキストエディタ上では、他の文字のように文字として表示されることはありません。改行のために割り当てらた文字コードを「改行コード」と呼びます。正規表現を使って「改行」をマッチングするには、この改行コードを正規表現として記述する必要があります。

改行コードをマッチする正規表現

改行コードはOSによって複数の種類が存在します。

// MacOS, Linux 環境の改行コード(Line feed)
\n 

// Windows 環境の改行コード(Line feed & Carriage return)
\r\n

// 古い MacOS (~ MacOS10)環境での改行コード (Carriage return)
\r

すべての改行コードをマッチする正規表現

上位の改行コードもいずれでもマッチできるよう、「|」を用いて下記のように表せます。

// すべての改行コードをマッチする正規表現
\n|\r\n|\r

「|(パイプ)」を使って「OR」の関係で表現すれば、どの改行コードであっても、マッチできるんだね。

【補足】OSごとの改行コードの違い

改めて、下記がそれぞれOSごとの標準の改行コード表現です。Macは古いバージョンでは「CR(キャリッジリターン)」でしたが、昨今、MacOS version 10から、Unix系と同じ「LF(ラインフィード)」に変更されましたね。

OS改行コード正規表現
LinuxなどのUnix系システムLF (Line Feed)\n
MacOS(v10~)LF (Line Feed)\n
MacOS (~v9)CR (Carriage Return)\r
WindowsCR + LF\r\n

「ラインフィード」と「キャリッジリターン」の名称は、それぞれ、タイプライターの時代からある歴史的な機能の名前が元になっています。改行コードについて、Wikiペディア:改行コード がかなり詳しいですので、ぜひご一読下さい。

なお、バックスラッシュで始まる特殊文字は「制御文字」などと呼ばれ、特定の文字コードを表すために使われます。改行コードも制御文字の1つです。

それでは、この改行コードのマッチングを使っていくつかの処理を実践してみます。

2023/3/16 誤字を修正しました。ご指摘ありがとうございました。

【実践1】PHPで、改行コードを置換により削除して出力

上述のように改行コードは3種類存在するため、それらのいずれが使われていてもマッチするような正規表現を記述する必要があります。下記はPHPで、改行をマッチして削除する処理の例です。上記の表で示したように、正規表現では改行コード「LF」「CR」はそれぞれ「\n」「 \r」 によって表現できます。

<?php

// 正規表現
$pattern = "#\n|\r\n|\r#";

// 対象文字列(改行を含む)
$subject = "The text
you need to search.";

// 改行コードをマッチング。空文字と置換して出力
echo preg_replace( $pattern, '', $subject )

デリミタに「#」を使っていますが、好みの問題なのでなんでも構いません。

PHPの詳しい正規表現関数の仕様は、公式ドキュメントをご覧ください:

「改行コード」を「空文字」と置換することで「削除」を実現できるんだね。

【実践2】Vimで、改行コードを置換して統一する

こちらは、Vimを使った改行コードの置換のの例です。正規表現をつかって複数の種類の改行コードを同時に検出し、すべてを意図する改行コードに統一してみます。

Step 1現在のファイルの確認

さて、実際に多く問題になるのが、異なるOSで保存されたファイルを取り扱うときです。

誰かがWindowsの環境で編集したファイル作成されたファイルを、Linux 環境の Vim で開くと・・、

一見、普通に見えるのですが、

正規表現で、改行を置換して削除。

Vimの「:set ff?」コマンドで、現在のファイルフォーマット(Vimで利用する改行の種類)の設定値を調べてみます。

// fileformat値を調べる
:set ff?

// 出力結果・・・
fileformat=dos

dos(Windows)とでました。これは、改行コードに「LF + CR」が利用されていると考えてよいでしょう。fileformat値の取りうる値は、おおよそ「dos」「unix」「mac」のいずれかです。

実際に確認するために、Vim のバイナリモードでファイルを開きます。一旦ファイルを閉じて、下記のコマンドで、バイナリモード開き直してみます。これにより、制御文字や、テキストとして認識できなかったバイナリが表示されるようになります。

// バイナリモードのVIMで起動
$ vim -b userAgent.php

これで開くと・・

「^M」が改行部分にたくさん表示されましたが、この記号は、まさしく Carriage Return を表しています。

実際には Line Feed の文字コードも文書内に存在しますが、Vim上では実際の改行として表現されています。(もし確認したい場合、:set list コマンドで Line Feed を「$」として表示できます。)

このように、いつも Line Feed で改行を表している開発環境に Carriage Return が紛れ込んでくると、例えば、Git の Diff などで、コード自体は変更がないはずなのに、差分として認識されてしまい、厄介な存在になります。昨今では多くの環境が Linux 系の OS で構築されていますので、LF で統一することも多いでしょう。

それでは、このファイルも改行を「LF」で統一するために、「^M」を削除してしまいましょう。

Step 2正規表現で「^M」を空文字と置換して削除する

正規表現を使った改行コードのマッチング方法がわっているので、置換は簡単ですね。上述のとおり、Carriage Return  の文字コードは制御文字「\r」で表現できます。

Vim の正規表現の置換は「:%s/置換前/置換後/g」です。

// ファイル内の、CR(^M) を消す
:%s/\r//g

もしくは、上記のかわりに「^M」の文字を、直接入力して置換することもできます。というもの、このCRの改行コードの表現にはもう一つの方法があり、下記のように特殊な入力方法で記述できるのです。

[Ctrl + V]、[Ctrl + M]と二文字、入力します。

// \r を使うのと、同じマッチングが可能
:%s/^M//g

置換が終われば、あとはファイルを保存すれば大丈夫です。簡単ですね。

(補足) Vim の改行コードの統一方法

なお、実際はこの正規表現の置換処理を実行しなくても、Vimで「:set ff=unix」として、ファイルフォーマットを変更して保存し直すだけでもうまくいくことがあります。

こちらの記事も参考にして下さい。

正規表現の改行コードに関する参考情報

以上、正規表現における改行と、具体的なマッチング方法、また置換や削除方法をご紹介しました。

改行のマッチングや置換に利用するテキストエディタは、Vimを使って置換しても構いませんが、SubLimeテキストなどでも、エディタの機能で同様に置換を実行できるでしょう。ちなみに、新ためてリンクですが、こちらにVimを使った置換についてより詳しくまとめています。