- 1. 基本的な使い方
- 2. メタ文字をクォートする
- 3. 能書き
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 関数は非推奨となりました。
2. メタ文字をクォートする
正規表現に関する説明で必ず出てくるのが「メタ文字をクォートする」という表現で。わたしもあまり意味を深く考えずにきましたが。この稿をおこすにあたって、そもそも「メタ文字をクォートする」っていうのはどう説明したらいいのだろう?という疑問にぶつかりました。説明できないってことは、わかってないことと同じですからねぇ。
ワイルドカードと正規表現とは違うと言いつつ、ワイルドカードで説明するとわかりやすいので、ワイルドカードの表現で説明します。
メタ文字とは、特別な文字のことです。unix コマンドの grep でいうと「*」「$」のこと(他にもありますが)です。特別な意味をもっている文字をメタ文字と言います。
で、このメタ文字をメタ文字として扱わずにその文字のまんまで使いたいときがあります。この場合、「*」や「$」の前に「¥」をつけて「¥.」「¥$」などとすると「*」「$」という文字そのものを探すことができます。
このようにメタ文字(特別な文字)を特別な文字でなく単なる文字として扱うようにすることを「クォートする」と言います。
3. 能書き
「qmail」で「procmail」を使用したりする場合、「php」や「Perl」を使用して何ものかを記述する場合、正規表現の記述が必要になります。
ここで『正規表現』とは何か?
「Wikipedia」をひもといてみますと「文字列の集合を一つの文字列で表現する方法の一つである。」と書いてますな。う~んわかりにくい。
ちょっとコンピュータを知っている人にわかるように説明すればワイルドカードに近いものですが…。実際には似て非なるもののようです。
力説していたサイトがあったのですがリンク切れになりました。
そのサイトも詳細には記述されておりませんで、本に書いても数ページに及ぶとのことでした。
学問的な定義はさておいて、まあここでは使い方がわかればよいので…。
英語の『regular expressions』のほぼ直訳が『正規表現』なわけですな。ほぼ直訳って逆にわかりにくいことが多いですね。昔のプログラミング言語の教本に『compile』を『翻訳』と記述していたものがあったようなものです。カタカナで『コンパイル』とした方がこの場合はすんなりはいってきます。
『正規表現』という言葉は歴史があるので、なかなか変えられないのでしょうが、非常にわかりにくく誤解を生みやすいような気がします。
『パターンマッチング書式』とかいう呼称にして欲しいなぁ…。駄目か?
まあなにしろ、文字列をパターン化してマッチングするものを分類して行ったりするもののために必要な書式なのです。
う~ん。この説明もわかりにくいか(笑)。
一応、「POSIX」に定義はありますが、その書式は言語(プログラミング言語のことです)によっても、異なるようです。
|
|