文字クラスで候補を絞る
角かっこ [ ] で囲むと、その中のどれか1文字にマッチする「文字クラス」になります。[abc] は a か b か c のいずれか1文字を表し、[0-9] のようにハイフンで範囲も書けます。先頭に ^ を置いた [^0-9] は「数字以外の1文字」という否定の意味になります。[A-Za-z0-9] のように範囲を並べれば英数字をまとめて指定できます。よく使う組み合わせは短縮表記の \d(数字)や \w(英数字とアンダースコア)でも表せます。
前の項目では . が「任意の1文字」を表すと学びました。しかし実際には「任意ではなく、この中のどれか1文字だけを許したい」という場面が数多くあります。たとえば「数字1文字」「a か b か c のいずれか」「英字だけ」といった、候補をあらかじめ絞り込んだ指定です。これを実現するのが文字クラスで、角かっこ [ ] を使って書きます。. が無条件に1文字を受け入れるのに対し、文字クラスは「許す文字の集合」を自分で定義できる、より精密な道具だと考えてください。検索の精度を上げ、余計なものを拾わないようにする要になります。前の項目で学んだメタ文字が「どんな1文字でもよい」という大づかみの指定だったのに対し、ここからは「どの1文字を許すか」を細かく決めていきます。
角かっこで候補を並べる
[ ] の中に文字を並べると、そのいずれか1文字にマッチします。[abc] は「a か b か c のどれか1文字」を表し、cat の a や cup の c に当たります。ここで大切なのは、いくつ文字を並べても一致するのは1文字だけ、という点です。[abc] は3文字に一致するのではなく、3つの候補のうちのどれか1文字に一致します。複数文字のくり返しが欲しければ、後で学ぶ量指定子と組み合わせて [abc]* のように書きます。文字クラスは「ここに来てよい1文字の顔ぶれ」を列挙したもの、とイメージすると分かりやすいでしょう。たとえば gr[ae]y と書けば、つづりの揺れる gray と grey の両方を一つの式で拾えます。
ハイフンで範囲を書く
候補が連続しているときは、ハイフン - を使って範囲で書けます。[0-9] は0から9までの数字1文字、[a-z] は小文字の英字1文字、[A-Z] は大文字1文字を表します。範囲は並べて書くこともでき、[A-Za-z] なら大小の英字、[A-Za-z0-9] なら英数字いずれか1文字を指します。たとえば「英字で始まる行」を探したいなら ^[A-Za-z] と書けます。範囲指定のおかげで、候補をひとつずつ書き並べる手間が省け、式も短く読みやすくなります。なお範囲はあくまで文字コードの並び順に沿うので、[0-9] のような自然な範囲を使うぶんには直感どおりに動きます。一方で [a-Z] のように大文字と小文字をまたぐ逆転した範囲はエラーや予期しない結果になりやすいので、英字を両方含めたいときは [A-Za-z] と分けて書くのが安全です。
先頭の ^ は否定になる
文字クラスの先頭に ^ を置くと、意味が反転して「この中以外の1文字」という否定の文字クラスになります。[^0-9] は「数字でない1文字」、[^a-z] は「小文字の英字でない1文字」を表します。ここで紛らわしいのが ^ の二面性です。文字クラスの外側、つまり ^abc のように行頭で使う ^ はアンカー(行頭の位置)ですが、[^abc] のように角かっこの中の先頭で使う ^ は否定の合図になります。同じ記号でも、角かっこの中か外かで役割がまったく違う、と区別して覚えてください。たとえば grep '^[^#]' file は「先頭が # でない行」、つまりコメントでない行を抜き出す書き方で、^(行頭)と [^#](# 以外の1文字)が組み合わさっています。
短縮表記と実例
よく使う文字クラスには、短く書ける別名が用意されています。\d は [0-9](数字)、\w は [A-Za-z0-9_](英数字とアンダースコア)、\s は空白類にほぼ相当します。ただしこれらの短縮表記は、grep では -P(PCRE)モードなど一部の方言でしか使えないので、どこでも確実に動かしたいときは [0-9] のように角かっこで書くほうが安全です。具体例を見てみましょう。grep '[0-9]' file は「数字を1文字でも含む行」を拾います。grep '[A-Z]' file なら大文字を含む行、grep '[^0-9]' file なら数字以外の文字を含む行を選びます。後の項目で出てくる [0-9] と量指定子を組み合わせて桁数を指定する書き方は、ここでの文字クラスが土台になります。
よくある失敗
つまずきやすいのは、角かっこの中ではメタ文字の多くがただの文字になる、という点です。たとえば [.] は「任意の1文字」ではなく「文字としてのドット」を意味し、[a.c] は a か . か c のいずれかになります。同様に [*] は文字としてのアスタリスクです。クラスの外では特別だった記号が、クラスの中では素直な文字に戻る、という切り替えを押さえておきましょう。逆に、これを利用して [.] や [/] のように「エスケープしたい記号を1文字だけ角かっこで囲む」書き方をすると、\ を使わずに記号そのものを表せて読みやすくなることもあります。また、ハイフンを範囲ではなく文字そのものとして含めたいときは、[-abc] や [abc-] のように先頭か末尾に置くのがこつです。中ほどに書くと範囲の意味になってしまいます。
実務の使いどころ
実務では、文字クラスは入力の形式チェックや特定パターンの抽出で活躍します。後の項目で扱う、[0-9] を量指定子と組み合わせてIPアドレスらしき並びを拾う使い方はその典型です。設定ファイルから「先頭が英字の実効行」だけを取り出す、ログから「英大文字を含む行(多くはレベル表記)」を選ぶ、ユーザー名として許される文字だけかを確かめる、といった場面で繰り返し使います。たとえば16進数らしき文字だけを許したいなら [0-9A-Fa-f]、英数字とハイフン・アンダースコアだけを許したいなら [A-Za-z0-9_-] のように、許可する顔ぶれを自分で組み立てられます。. が大雑把に1文字を受け入れるのに対し、文字クラスは「どんな文字を許すか」を自分の言葉で定義できる、正規表現の中核的な部品です。まずは [0-9] [a-z] [A-Z] と、否定の [^…] を手に馴染ませておくと、検索の狙いを正確に絞れるようになります。