開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

正規表現:改行コードの表現方法。

最終更新:2017-12-16 by Joe

正規表現で、改行コードを表現する記述方法と、改行にまつわる操作をまとめました。

「改行コード」とは

改行は、特定の文字コードで記述された制御文字の1つで、通常は他の文字のように表示されることはありません。改行を表す文字コードを「改行コード」と呼びます。

正規表現を使って改行をマッチングするには、この特定の改行コードを表現する必要がありまが、一方で、実際の改行コードは、OS(オペレーティング・システム)によって、異なる文字コードが使われるため、少し注意が必要です。OSによる改行コードの違いは、歴史的な問題なので、どうすることもできませんが、この事実を把握しておくことは重要です。

OSごとの正規表現

下記がOS毎の改行コードの表現です。

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

Macは古いバージョンでは「CR(キャリッジリターン)」」でしたが、昨今、バージョン10から、Unix系の「LF(ラインフィード)」に変更されました。

改行コードについて、Wikiがかなり詳しいですので、ぜひご一読下さい。

改行コードの表現方法

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

例)PHPでの改行のマッチング

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

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

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

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

PHPマニュアル:

実践:置換を使って改行コードを統一する

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

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

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

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

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

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

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

やはりdos(Windows)とでました。より詳しく正体を暴くために、vimのバイナリモードでファイルを開きます。一旦ファイルを閉じて、下記のコマンドで開き直します。

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

これで開くと・・

でました。「^M」がCarriage Returnの正体です。(実際はLine Feedの文字コードも文書内に存在しますが、Vim上では実際の改行として表現されています)これらが紛れ込んでくると、とくにGitのDiffなどで、コード自体は変更がないはずなのに、差分として認識されてしまい、厄介な存在になります。

Mac OSもバージョン10移行から、改行コードはLF(Line Feed)がデフォルトとなりました。昨今では多くの環境がLinux系のOSで構築されていますので、LFで統一することも多いでしょう。

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

2)改行コード「^M」を空文字と置換する

マッチの方法がわっているので、あとは置換は簡単ですね。上述のとおり、Carriage Return は「\r」で表現できます。

VIMでの置換の例

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

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

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

あとは保存すれば大丈夫です。簡単ですね。

実際は「:set ff=unix」として保存し直すだけでもうまくいくことがあります。こちらの記事も参考にして下さい。

参考

Vimによって置換しても構いませんが、SubLimeテキストなどでも、エディタの機能で置換を実行できるでしょう。

ちなみに、こちらにVIMを使った置換についてより詳しくまとめています。

 

閉じる