1分で実現できる有用な技術 Advent Calendar 2016が空いていたので、飛び入り参加しました。
システム開発にあたって、真にプログラムを書いている時間と匹敵するぐらいに、「あれはどう書いたかな」と探す作業が発生します。そんな場面できっと役に立つ、正規表現のメタ文字を紹介します。
grepで引っかかる邪魔者
プロジェクトディレクトリ全体で「何か探しものをしたい」といえば、たいていgrepの出番ですが、単なる文字一致で検索しても意図しないものが大量に引っかかってしまいます。たとえば、sign_in
で検索すればsign_in_and_redirect
にもヒットしてしまいます。とはいえ、「うまくヒットする条件」を考え出すと、そっちのほうが手間になります。
お手軽な区切り文字
そんなときに、\b
というメタ文字が役に立ちます。これは、「単語の端っこ」という位置にヒットする(文字と対応しない)メタ文字です。\bsign_in\b
として検索すれば、「sign_in
の前後で単語が切れているもの」というような検索になります。GNU grepでは-E
なしですら使えるなど、多くの正規表現実装が対応しています。
注意点
「人間がgrepするときにノイズを減らす」という用途を考えればあまり問題ないですが、この正規表現にはいくつか注意すべき点があります。
- 「単語」を構成する文字は(ASCIIの範囲内では)通常「英数字とアンダーバー」です。HTMLやCSSのクラスに入るハイフン、言語によっては変数名に使える
$
など、「切れ目」と認識されるために除ききれないものもあります。 - 全角文字についてはRuby内ですらエンコードによって異なるなど、ASCII外でどの文字を「単語」の要素とするかは実装によってまちまちです。もっとも、大半のプログラムでは識別子にASCIIの文字列しかほぼ使わないでしょうし、本稿のような用途では実用上問題ないと思います。