心に響く正規表現〜フクロウ本はなぜ名著なのか?

詳説 正規表現 第2版

詳説 正規表現 第2版

ずっと前に買ったまま積読になっていたフクロウ本を最近読んでいる。カバンに放りこんで通勤時に読んでいるのでなかなか進まないけれど、その内容はすばらしい。
「コンピュータの名著・古典100冊」に数えられているものの、所詮正規表現なんて今や何にでもついてくる只の便利なツールでしょ、本腰入れて勉強する必要なんか無い無い、って皆が思っているからこそポケットガイドやらデスクトップリファレンスやらが溢れていて、こんな分厚い本を読む必要なんかないんじゃないか、と私も思っていたのだが...。

本書の章立てはこうだ。

  1. 正規表現とは
  2. 基本的な問題例
  3. 正規表現の種類と機能
  4. 正規表現の処理メカニズム
  5. 正規表現の実践技法
  6. 正規表現を工夫する
  7. Perl
  8. Java
  9. .NET

7章以降は表題のとおり各言語上での正規表現の使い方だが、本書の導入部には「まず1〜6章までを読み物として読んでほしい」とある。読み物でいいんすか?ただ漫然と読むだけで?
これを鵜呑みにしてまず読んでみる。1章はまあごく普通の導入、2章ではこういう問題はこう解く、という「あるある」問題例が示される。メールアドレスとかHTMLタグのバリデーションとか。
そして3章で正規表現の言語要素が全て紹介される。メタ文字、量指定子、文字クラス、各種の括弧etc。面白いのは概念を先に説明し、それがこの言語では{}だけど他では\{\}だよとか、\<\>は他では\bだよって感じに書いてある。つまりポケットリファレンスとは違って「こうやりたいけどこの言語だとどう書けばいいの?」という"How"の細切れの集まりではなく、「正規表現全体にはこういう概念があって、これとこれはこの言語では対応してないよ」という形式なので"What"が掴みやすい。
リファレンス使ってた頃は「正規表現ってコレできるの?できないの?」という疑念が尽きなかったが、これを読んだ後は「正規表現でできる、できない」が直感的にわかるようになった気がする。まあ今が3章読んだ直後だってこともあるけど。
しかし、リファレンスと違って圧倒的に頭に入りやすいとはいえ、3章までなら書いてある知識にはそれほどの差はない。他では得られない知識が詰まっているのは4章から先だ。
大抵の正規表現は短い文字列として書かれるため、なんとなく宣言的なものに感じてしまいがちだ。例えば"^\d{2,3}\s*$"は"数字2〜3桁の後に空白文字が許された行"だし、関数的に一瞬にして処理されるもの、実行順序を問わないものとして考えてしまいがちだ。
ところが本書の4章を読むとこれが完全に手続き型で解説されている。これによって"^\d{2,3}\s*$"からアルゴリズムを読みとることができるのだ。確かに内部で文字列比較するなら最終的には手続き型で処理するのは当然なんだけど、これには目から鱗が落ちた思いだ。正規表現の文字列を一見して宣言的に理解するのかアルゴリズムを読みとれるのかの違いは、メソッドの宣言だけ見る事と本文を読む事くらい違う。この意識があるかないかで正規表現の読み方も書き方もまるで違ってくる。
続けて5章、といきたいとこだけど今まだ4章読み終えたところなので書けない。つーか読んだら書く。


改訂新版 コンピュータの名著・古典100冊

改訂新版 コンピュータの名著・古典100冊