正規表現のススメ | CyberX:エンジニアブログ

正規表現のススメ

Xでエンジニアとしてお世話になっている矢入です。

正規表現使ってますか?
ログ解析や特定のパターンの文字の一斉置換やらお世話になりっぱなしだと思います。
そして思った通りの正規表現がかけたときは本当に楽しくなります。

ところで使える、使っているという方はどのようにして正規表現を学びましたか?
前任者が書いたコードでなんとなく覚えたとか、それをもとにネットで調べてなんとなく使えるようになっているというパターンが結構多いのではないでしょうか。
自分もそのパターンでした。
しかしあるとき、プログラム内に記述した正規表現がうまく機能せず、それが果たして正規表現の間違いなのか、そもそもプログラムの問題なのか切り分けができず予想外に時間を食ってしまいました。
そこでこれを気にしっかりと学んでみようと手にとった、皆が大好きオライリーの「詳説正規表現 第三版」を読んだところ、いかに自分が意味を正しく理解せず使用していたかを痛感したのでした。

この本は面白いです。
技術的な話しはもちろんのこと、学んだことの理解度を図るための例題の出し方、ユーモアにあふれたセンスのある文章、単純に読み物としても面白いのです。
お値段はご存じの通りなので躊躇してしまうかもしれませんが、買わないまでも、ぜひ一度は目を通しておいてほしい本の一つです。
そしてこの本を読んだ後にはきっと、序説で紹介されている第一般が発売されたときに寄せられたメッセージに大きく共感できるようになるでしょう。

「この本を読むまで、自分は正規表現について知っているつもりでしたが、それは間違いでした。この本を読んで本当の意味を理解できました。」


正規表現の本を読みましょう!で終わっても芸がないので、よく見かける勘違いを交えて、正規表現のさわりに触れたいと思います。
(といってもこんな感じの内容がそのまま本に記されています)

テキストの中に含まれる「gray」もしくは「grey」という文字の並びをマッチさせたい場合があるとします。
これを文字クラス [] を用いてマッチさせたい場合、以下のパターンは適切でしょうか。

gr[a|e]y

文字クラスでは [] の中に記された任意の1文字にマッチします。
そういう意味ではたしかに「a」にも「e」にもマッチするので間違いとはいえなさそうです。
では文字クラス内にある「|」はどういう意味でしょう。
「|」は正規表現では「または」の意味の便利なメタ文字です。
上記のように書いた人はきっとそのような効果を期待したに違いありません。
しかし文字クラス内の「|」は「または」という意味にならないのです。
結果、上記正規表現では「gr|y」という文字があった場合、それにもマッチしてしまうことになり、不必要なデータが検出されてしまいます。
文字クラスの中では通常意識して使うメタ文字がメタ文字ではない場合が往々にしてあるのです。
これらのメタ文字は決まり事なのでただ覚えるだけですが、本の中ではこれを以下の様に補足して、非常に理解しやすくしています。

「文字クラスは、また別のミニ言語と考えると良い。どのメタ文字をサポートし、それらがどのような意味を持つかは、文字クラスの中と外とで全く意味が異なる。」


なんとなく理解していることを言葉にしてもらえると非常に理解が深まっていきます。
この本は正規表現を学ぶ上で、そういった言葉に満ち溢れています。
新しい技術もいいですが、足元を固める技術もこれを気にしっかり学んでみませんか?
というわけで「詳説正規表現 第三版」は凄くオススメです。(最後まで本の宣伝)


終わり。