* U K I Y A H O N P O *
Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura,
che la diritta via era smarrita.
リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
浮子屋商店もよろしく。

正規表現講座/5 のバックアップソース(No.1)

TITLE:間違いだらけの正規表現講座 level 5

#contents

* メタスケープ! [#ebcc5c46]

さて、間が空いてしまいましたが、第5回です。~
今回は、「メタ文字」「エスケープ」「改行の扱い」について覚えましょう。

* メタ文字 [#v0bb85b0]

今まで、正規表現特有の記号について覚えてきました。~
たとえば、「*」、「+」、「()」など、これらはそれぞれ特有の意味を持っていました。

このような、「正規表現で特別な意味をもつ記号」のことを、「メタ文字」と呼びます。~
メタ文字には、今まで紹介したものの他に、次のようなものもあります。

|\t|タブ記号1文字をあらわす。|
|\n|改行記号1文字をあらわす。0Aを表すことが多い。|
|\r|改行記号1文字をあらわす。0Dを表すことが多い。|
|\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行分下に送る=ラインフィード
から来ているのです。



* ご指摘などはこちらへ [#da83ba4f]

#comment