メタスケープ!
さて、講座も多分折り返しくらいでしょうか、第5回です。
今回は、「メタ文字」「エスケープ」「改行の扱い」について覚えましょう。
なお、今回本文中に「\」という文字がいっぱい出てきます。
バックスラッシュに見えている環境が多いと思いますが、
これは日本語環境での、半角の「¥」記号と同じです。
メタ文字
今まで、正規表現特有の記号について覚えてきました。
たとえば、「*」、「+」、「()」などです。
これらはそれぞれ特別な意味を持っていました。
このような、「正規表現で特別な意味をもつ記号」のことを、「メタ文字」と呼びます。
メタ文字には、今まで紹介したものの他に、次のようなものもあります。
\t | タブ記号1文字をあらわす。 |
\n | 改行記号1文字をあらわす。0A(文字コード、16進数で10)を表すことが多い。 |
\r | 改行記号1文字をあらわす。0D(文字コード、16進数で13)を表すことが多い。 |
\xnn | 文字コードが16進数でnnの1文字をあらわす。 |
タブ記号の説明は要りませんね。
例えば
ほげ\t+へも
と書くと、
「『ほげ』があってその直後にタブが1つ以上あって、その後に『へも』がある」
という正規表現になるわけです。
改行記号は説明が必要かもしれません。
OSによって改行を表す文字コードが異なるため、このように二つのメタ文字があります。
- Windowsでは文字コード 0D 0A の2文字で1つの改行を表します。
- UNIXでは文字コード 0A の1文字で1つの改行を表します。
- Macでは文字コード 0D の1文字で1つの改行を表します。
そして、\rと\nがそれぞれ 0D と 0A のどちら(或いは両方)を表すのかは、
正規表現をつかうツールによって異なります。
ほとんどの場合、Windowsでは、\r\n もしくは \n で改行を表すことができます。
エスケープ
さて、正規表現には色々なメタ文字が用意されていますが、その文字自身を表したいときは
どのようにすれば良いでしょうか。
例えば、「()で囲まれた数字を探す」とき、どのような正規表現を書きますか。
([0-9]+)
と書いてしまうと、「()」が第4回で学んだ「まとめて1つ」の意味になってしまいます。
そのような時に必要なのが、「エスケープ」です。
「エスケープ」は、「メタ文字を普通の文字とする」意味があります。
ほとんどの正規表現ツールでは、メタ文字の前に「\」をつけることによって、
「エスケープ」することができます。
例えば、さっきの例では、
\([0-9]+\)
と書けば望むものが検索できるわけです。
「\」自身を検索したいときは、「\\」と書きます。
「\t」という文字列そのもの(タブ記号じゃないですよ)を検索したいときは、
「\\t」と書くわけです。
ちなみにこれが、複雑な正規表現が「\」まみれになる理由だったりします。
改行の扱い
正規表現を扱うツールには、「シングルラインモード」のON/OFFができる
場合があります。
これ、何が変わるかというと、主に「.」の扱いが変わるのですね。
- シングルラインモードONでは、「.」は改行コード(\rや\n)にもマッチします。
- シングルラインモードOFFでは、「.」は改行コードにマッチしません。
エディタ等ではほとんどの場合、シングルラインモードはOFFだと思いますが、
改行を超えて文字列を検索したい場合など、シングルラインモードをONにすると
便利な場合もあります。
たとえば、HTMLの中の <a href="~">○○</a> という部分を探したい場合。
シングルラインモードOFFで、普通に「<a href=".*">.*</a>」と書いてしまうと、
<a href="mononoke.html">
もののけ
</a>
は、「もののけ」の前後に、改行文字=「.」に当てはまらない文字、が入っているため、
マッチしません。そのような時に「シングルラインモードON」が使えます。
「シングルラインモード」の呼び名はツールによって異なるので、探してみてください。
ちょっと脱線
0Dのことをキャリッジリターン(CR)、0Aのことをラインフィード(LF)
と呼んだりします。
これ、いにしえのタイプライタ時代の「改行」の動作、
- 文字を打つヘッダ(キャリッジ)を左に戻す=キャリッジリターン
- 紙を1行分下に送る=ラインフィード
から来ているらしいですが、キーボード配列のQWERTYなど、
コンピュータって、変なところで昔の慣習を引きずっているものです。
ご指摘などはこちらへ