1. 正規表現 - 概論

 
1.1 基本的な使い方
1.2 メタ文字をクォートする
1.3 能書き

1.1 基本的な使い方

 ここでは php を例にとって説明します。php の関数に PCRE 関数というものがあります。これは Perl 互換の正規表現を扱う関数群((computing) Perl-compatible regular expressions)です。  preg_filter という関数があります。使用方法の一つに

preg_filter($pattern, $replacement, $subject)
という使い方があります。これは、subject の文字列から pattern にマッチする文字列があれば replacement という文字列に置き換えるものです。  ここで IP アドレス 192.168.0.0/16 (IPv4 のローカルアドレスのひとつ) にマッチするか判断して、マッチすれば「match」という文字列にしようとすると

preg_filter('/192\.168\.[0-9]{1,3}\.[0-9]{1,3}/', 'match', $検索対象文字列)
と記述することができます。  「/」(スラッシュ)はパターンの開始と終了を示します。  「192」と「168」はそのままの文字です。  「¥.」(バックスラッシュとドット)はスラッシュが「メタ文字をクォートする」意味で使っていますので、「.」(ドット)文字そのものということになります。  [0-9]は「0」から「9」までのいずれかつまり「0」「1」「2」「3」「4」「5」「6」「7」「8」「9」のいずれかの文字という意味です。  {1,3}は、[0-9]の文字が1文字以上3文字以内連続しているという意味です。  以上により「192.168.0.0」から「192.168.255.255」だと「match」という文字が返ることになります(実際にはあり得ない IP アドレスですが「192.168.999.999」まで「match」になりますが…)。 Tips
 もともと php には ereg という POSIX 拡張の関数群があったのですが、バイナリセーフではなかったようで、バイナリセーフな PCRE の方が推奨されるようになっています。PHP 5.3.0 以降 ereg 関数は非推奨となりました。

1.2 メタ文字をクォートする

 正規表現に関する説明で必ず出てくるのが「メタ文字をクォートする」という表現で。わたしもあまり意味を深く考えずにきましたが。この稿をおこすにあたって、そもそも「メタ文字をクォートする」っていうのはどう説明したらいいのだろう?という疑問にぶつかりました。説明できないってことは、わかってないことと同じですからねぇ。  ワイルドカードと正規表現とは違うと言いつつ、ワイルドカードで説明するとわかりやすいので、ワイルドカードの表現で説明します。  メタ文字とは、特別な文字のことです。unix コマンドの grep でいうと「*」「$」のこと(他にもありますが)です。特別な意味をもっている文字をメタ文字と言います。  で、このメタ文字をメタ文字として扱わずにその文字のまんまで使いたいときがあります。この場合、「*」や「$」の前に「¥」をつけて「¥.」「¥$」などとすると「*」「$」という文字そのものを探すことができます。  このようにメタ文字(特別な文字)を特別な文字でなく単なる文字として扱うようにすることを「クォートする」と言います。

1.3 能書き

 qmail で procmail を使用したりする場合。php や Perl を使用して何ものかを記述する場合、正規表現の記述が必要になります。  ここで『正規表現』とは何か? Wikipedia をひもといてみますと「文字列の集合を一つの文字列で表現する方法の一つである。」と書いてますな。う~んわかりにくい。  ちょっとコンピュータを知っている人にわかるように説明すればワイルドカードに近いものですが…。実際には似て非なるもののようです。  「ここ」に力説してありますが、残念ながら定義については詳細に記述されていません。(本に書いても数ページにおよぶとのこと)  学問的な定義はさておいて、まあここでは使い方がわかればよいので…。  英語の『regular expressions』のほぼ直訳が『正規表現』なわけですな。ほぼ直訳って逆にわかりにくいことが多いですね。昔のプログラミング言語の教本に『compile』を『翻訳』と記述していたものがあったようなものです。カタカナで『コンパイル』とした方がこの場合はすんなりはいってきます。  『正規表現』という言葉は歴史があるので、なかなか変えられないのでしょうが、非常にわかりにくく誤解を生みやすいような気がします。  『パターンマッチング書式』とかいう呼称にして欲しいなぁ…。駄目か?  まあなにしろ、文字列をパターン化してマッチングするものを分類して行ったりするもののために必要な書式なのです。  う~ん。この説明もわかりにくいか(笑)。  一応、POSIX に定義はありますが、その書式は言語(プログラミング言語のことです)によっても、異なるようです。