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