開発ブログ
Git、CSS、HTML、正規表現など、入門者がつまづきそうなポイントを中心に、役立ち情報発信します。。

正規表現:改行コードの表現方法、置換と削除

最終更新:2018-06-18 by Joe

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

正規表現における「改行」

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

一方で、改行コードはOSによって異なる文字コードが使われているため、少し注意が必要です。

OSごとの改行コード

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

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

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

正規表現を使った改行のマッチング

さて、実際に正規表現を使って、改行をマッチしてみましょう。

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

【PHP】改行コードのマッチング

上記の表で示したように、正規表現では改行コード「LF」「CR」はそれぞれ「\n」「 \r」 によって表現できます。(デリミタに「#」を使っていますが、好みの問題なのでなんでも構いません。)

<?php

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

// 対象文字列
$subject = "The text
you need to search.";

// 改行コードをマッチング
if ( preg_match( $pattern, $subject ) ) {
  echo '改行が見つかりました!';
}

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

【参考】Vim:改行コードを置換により統一する

実際、正規表現をつかって複数の種類の改行コードを同時に検出し、すべてを意図する改行コードに統一してみます。

Step 1現在のファイル内のコードの確認

さて、実際に多く問題になるのが、異なるOSで保存されたファイルを取り扱うときです。Windowsの環境で作成されたファイルを、Linux 環境のVIMで開くと・・、

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

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

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

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

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

やはりdos(Windows)とでました。これは、改行コードに「LF + CR」が利用されていると考えてよいでしょう。

実際に確認するために、vimのバイナリモードでファイルを開きます。一旦ファイルを閉じて、下記のコマンドで、バイナリモード開き直してみます。

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

これで開くと・・

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

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

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

Step 2「^M」を空文字と置換して削除する

マッチの方法がわっているので、置換は簡単ですね。上述のとおり、Carriage Return  は「\r」で表現できます。もしくは、「^M」をい直接置換することもできます。

VIMでの改行コードの置換例

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

このCRの改行コードの表現には、もう一つの方法があり、下記のように「^M」の文字を直接マッチさせることもできます。「^M」は特殊な文字記号ですので、入力方法が特殊です。(キャレットとMではありません)[Ctrl + V]、[Ctrl + M]と二文字、入力します。

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

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

なお、実際はこの置換を実行しなくても、Vimで「:set ff=unix」として、ファイルフォーマットを変更して保存し直すだけでもうまくいくことがあります。こちらの記事も参考にして下さい。

【参考】PHP:改行コードを空文字と置換して削除する

こちらに「改行コードを削除する」という例も記載しておきます。PHPによる例です。

<?php

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

// 対象文字列
$subject = "The text
you need to search.";

// 改行コードを空文字と置換
$result = preg_replace( $pattern, '', $subject )

if ( $result === NULL ) {
  echo 'エラーが発生しました。';
} else {
  // 処理された文字列
  echo $result;
}

preg_replace() 関数の戻り値は、改行の置換が発生すれば、置換処理が終わった後の文字列が出力されます。

PHPの置換関数 preg_replace() の仕様はドキュメントをご確認下さい。

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

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

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

 

閉じる