header

正規表現の強み

(1/2)

Wikipediaによると、「正規表現(せいきひょうげん:regular expression)とは、文字列の集合を一つの形式で表現する方法」である。曖昧な定義であるが、PHPで正規表現を利用する場面は、ずばり、文字列の検索と置換である。

正規表現を使うと曖昧な検索ができる

たとえばネット上から集めたファイルの中から、その中から "Mac OS X" という単語を検索したいとする。インターネット上であれば Yahoo! や Google を使って簡単にできることなのだが、自分でプログラムを組んで、ローカルファイルに対して同じ処理をさせようとすると、かなり苦労をする。
というのは、"Mac OS X" のスペリングとして "Mac OS X"、"MacOS X"、"OS X"の3種類があるからだ。さすがに "mac os x" とか "os x" と書く人は少ないと思うが、絶対にいないとは言えない。
となると、複数のスペリングに合致するような検索プログラムを書かなければならない。

これを if 文にしたら、

if ($str == "Mac OS X" || $str == "MacOS X" || $str == "OS X") {

となるだろう。それとも、switch〜case文で書くだろうか。
いずれにしても、パターンが多くなければなるほど、プログラムのメンテナンス性が低下する。

そこで登場するのが正規表現である。
PHPの正規表現を用いると(ここでは Perl 互換の正規表現が利用できる関数 ereg シリーズを例に挙げる)

((Mac)?\s*OS\s*X)

と1行で書くことができる。
初めての方には怪しげな記号が並んでいるだけと映るかもしれないが、これは "OSX" にもマッチする。想定外の検索パターンが出てきた場合、柔軟に対応できるのが正規表現の強みである。
さらに "mac os x" や "os x" も検索対象としたいなら、正規表現はそのままで、大文字・小文字を区別しない関数を利用すればよいだけである。

正規表現で日本語も同じように扱えるのがPHPの強みである。
たとえば、PHPのような「サーバサイドスクリプティング」は、「サーバサイドスクリプティング」「サーバーサイドスクリプト」「サーバサイドスクリプト」と書く人もいるだろう。この4種類のすべてにマッチする正規表現は

(サーバー?サイド[スクリプティング|スクリプト]+)

である。

次のページにデモ・プログラムを掲げる。今後の正規表現の学習に利用してほしい。

(この項つづく)