#083 正規表現の解説(その1)

1999/09/28

<前目次次>


 という次第で、折角便利なものなのだから使ってもらわなくては損であるという考えから始めた正規表現基礎講座である。今回と次回の2回で、正規表現の種類をすべて説明する。簡単なところから順を追って説明していくつもりであるが、分からないところがあったら途中でもいいので手を挙げて質問してほしい。と言いたいところだが残念なことに、私からは挙手が見えないので、メールででもお知らせしてほしい。

 以下は、基本的にPerlの場合について解説している。後に述べるように、Perl以外のツールでは使えなかったり表現が違う正規表現もある。またわかりやすいように、日本語などの多バイト文字に対応した正規表現であることを仮定している。

・普通の文字(の並び)

 最も基本的なものとして、例えば正規表現「a」は、「a」を含む文字列にマッチする。すなわち、fatherやcatなど、「a」を含んだものすべてにマッチする。
 普通の文字の並び、例えば正規表現「her」は、herにマッチするのはもちろん、hereやthereや、あるいは「I like my brother」という文章にもマッチする。そのものずばりではなく、部分的に含む場合もマッチすることに注意されたい。hereやbrotherなどを除き、「her」という単語のみにマッチさせたい場合には、また別の方法を使う。

・任意の文字

 「.(ピリオド)」1つは、任意の1文字にマッチする。すなわち「.」という正規表現は、「a」でも「b」でも「I hate Bill Gates」でも「たしまけましたわ」でも何でもマッチすることになる。「C.I」は「CGI」にも「CUI」にも「CAI」にもマッチする。正規表現中に複数回使われる「.」は、必ずしも同じ文字に一致する必要はない。例えば「.ん.」ならば「だんな」や「とんび」や「○んこ」などにマッチする。

・エスケープシークエンス

 特殊な文字を表すために、いくつかのエスケープシークエンスというものが用意されている。例えば「\n」は改行を、「\r」は復帰を、「\t」はタブを、「\f」は改頁を表すと言ったものである。ただしこれには、ツールによって定義されているものがいろいろと違っていたりする。例えばsedの中には「\n」しか理解しないものもある。定義されていないもの、例えば「\c」などは、「c」そのものを表すことになっている。
 Perlなどではこのほか\ooo(oooは8進数の並び)や\xhh(hhは16進数の並び)や\cC(Cはコントロールコード)によって、文字を直接コード指定することもできるが、普通の文字列を扱っている分にはこれらに頼る必要はまずない。

・文字の集合

 「a または b」と言ったように、複数ある文字の内のどれか一つにマッチさせたいという場合もある。その場合は、複数ある文字を列挙し[ ]で囲むことで「[ ]内に指定された文字の内のどれか」という意味を表現することができる。これを「キャラクタクラス」とも言う。例えば [abc] は、aまたはbまたはcのどれか、という意味になる。「0[56]0-」ならば、「050-」または「060-」という意味になる。[ ]の中には、先に紹介したエスケープシークエンスも含めることができる。
 [ ]内に指定する文字は、文字コード上連続した文字を「-(ハイフン)」を使って一まとまりで範囲指定することもできる。例えば、[0-9][0123456789] と同じ意味になる。
 また逆に「a または b 以外の文字」というように、指定した文字の集合を否定するには、[^ ]のように、先頭に「^(サーカムフレックス)」をつける。例えば、[^a-z] は、「英小文字以外の文字」を表す。

・文字集合を表すエスケープシークエンス

 Perlの場合、よく使われる文字集合はエスケープシークエンスで表現することが可能になっている。例えば「数字」は\d[0-9])、「単語構成文字」は\w[0-9A-Z_a-z])、「空白文字」は\s[ \t\f\r\n])である。(恐らくそれぞれ、digit, word, spaceから来ているものだと思われる。)そしてこれらを大文字にしたもの(\D,\W,\S)は、その否定集合、すなわち「数字以外」「単語構成文字以外」「空白文字以外」を表す。


<前目次次>