#084 正規表現の解説(その2)

1999/10/05

<前目次次>


 正規表現の種類を説明する2回目である。説明ばかりであまり面白くないかもしれないが、おつきあいいただければ幸いである。

・位置指定文字

 「^」は対象とする文字列の先頭にマッチする。同様に「$」は対象とする文字列の末尾にマッチする。「^1999」とすれば、先頭にある「1999」にのみマッチする。先頭や末尾に記述されていない「^」「$」については、普通の文字として扱われる。
 よくある表現として、「^$」は「先頭の次にすぐ末尾が来る」ということで、何も文字を含んでいない文字列、すなわち空文字列にマッチする。
 また「\<」は単語の先頭に、「\>」は単語の末尾にマッチする。先の例で「her」という単語にマッチさせたい場合には、「\<her\>」と指定することになる。この場合には「here」や「brother」にはマッチしない。Perlの場合は「\<」「\>」のかわりに、単語境界にマッチする「\b」及び、単語境界以外にマッチする「\B」が使える。
 位置指定文字は、具体的な文字にマッチするわけではないことに注意。

・正規表現の並び

 複数の正規表現で表現されるうちのどれか、というものを指定したい場合は、それらの正規表現を「|」でつないで並べる。その際、まぎらわしくならないように、( )で括ってグループ化することも可能である。例えば、「I use (Windows|MacOS|Linux)」は、「I use Linux」にも「I use Windows, but I don't like it」にもマッチする。(文字列の一部でも構わないことに注意。)

・正規表現の繰り返し

 任意の正規表現は、これから述べる記号(量指定子)によって、任意の回数繰り返すことができる。
 「*」は、直前の正規表現を0回以上繰り返す。例えば「うひょー*」は「うひょ」「うひょー」「うひょーーーーー」などにマッチする。文字ではなく、文字列に対して繰り返しを指定する場合は、( )を使い正規表現をグループ化する。例えば「う(ひょ)*ー」は「うー」「うひょー」「うひょひょひょひょー」などにマッチする。「ひょ」が0回でも構わないことに注意されたい。先の「任意の文字」を表す「.」と組合わせて「.*」などとやると、任意の長さの文字列とマッチする。「あ.*し」は「あかし」にも「あそびにいきたし金はなし」にもマッチする。
 「+」は、直前の正規表現を1回以上繰り返す。先の例に似ているが「うひょー+」とすると「うひょー」「うひょーーー」にはマッチするが、「うひょ」にはマッチしなくなる。また、「?」は、直前の正規表現が0回または1回現れることを意味する。「あ?い?う?え?お?」は「」や「」や「あい」や「あお」や「いえ」や「うお」などにマッチする。
 一般化した量指定子として、「{m,n}」は、直前の正規表現をm回以上n回以下繰り返す。同様に「{m,}」は「m回以上の繰り返し」、「{,n}」は「n回以下の繰り返し」、「{n}」は「ちょうどn回の繰り返し」を表す。「*」は「{0,}」、「+」は「{1,}」、「?」は「{0,1}」の略記法ということになる。なお、Perl以外では「{」「}」は「\{」「\}」と記述する。

・メタキャラクタのエスケープ

 これまで見てきたように、正規表現では「.」や「[」など、様々な記号が特殊な意味に使われている。このような、字面の意味とは違った意味に拡張されて使われている文字をメタキャラクタと言う。従って、メタキャラクタとして用いられている「.」や「[」などの文字を、純粋に「.」や「[」の文字として表したいと思った時に困ってしまう。そのためには、メタキャラクタの先頭に「\」をつけてそのメタキャラクタの持つ意味を消す(エスケープする)ことができる。例えば「*.*」という文字列を表す場合、すべてメタキャラクタなので、正規表現では「\*\.\*」と書かなくてはならない。また「\」自体を表す時は、「\\」という具合になる。

・後方参照

 置換などのコマンドにおいて、指定したパターンを保存し再度使いたいと言う場合は、保存したいパターンを( )で囲む。( )で囲まれたパターンは、「(」の並ぶ順に、( )内のパターンを\1,\2,\3…で参照することができる。例えば「松島や ああ松島や 松島や」のようなパターンは、「(..)や ああ\1や \1や」と表すことが出来る。なお、Perl以外では「(」「)」はそれぞれ「\(」「\)」と記述する。つまりPerlの場合は、正規表現のグループ化に用いる ( ) と、後方参照のための ( ) を区別していない。


<前目次次>