正規表現入門

正規表現とは一種類以上のある特定の表現を含む文字列を一つの表現でマッチさせるためのパターンの表記方法の一つです。

例えば、it's coming up like a flowera flower in bloom といったような、flower という表現を含む文字列にマッチさせる正規表現は flower と書けます。
一つの特定の表現(flower)を含む文字列を一つの表現(flower)でマッチさせる正規表現の例です。
このように flower という単なる文字列も正規表現に含まれます。

そして、少なくとも flower もしくは flour のいずれかを含む文字列にマッチさせる正規表現は flo..?r と書けます。
複数の特定の表現(flowerflour)を一つの表現(flo..?r)でマッチさせる正規表現の例です。
このように、共通部分はそのままの文字を用いて表現する一方、非共通部分を吸収するために特殊な記号を用います。

正規表現においてピリオドは任意の一文字にマッチし、クエスチョンマークは直前の正規表現 (通常の文字も含む。本例の場合はピリオド、すなわち任意の一文字) にマッチする文字が一度もしくは0回出現する文字列にマッチします。
ですから、以上の正規表現は flowerflour だけでなく、floor という特定の表現を含む文字列にもマッチします。

この例では各表現とも flo で始まるので、正規表現の冒頭の flo にマッチします。
そして、それぞれ、w, u, o が正規表現の一つ目のピリオドにマッチします。
続いて、二つ目のピリオド(任意の一文字)とクエスチョンマークのセットで任意の一文字が0回もしくは一回出現するものにマッチする正規表現になるので、flower の場合は e にマッチし、他の二つは何もマッチしない、すなわち、任意の一文字が0回マッチすることになります。
そして正規表現の最後の r に全ての文字列の最後の r がマッチします。以下の図を参考にしてみて下さい。

       : flo ..? r
flower : flo we  r
flour  : flo u   r
floor  : flo o   r

繰り返しになりますが、以上のように、通常の文字も正規表現を構成します。
また、ピリオドやクエスチョンマーク以外にも特殊なパターンを示す記号が正規表現を構成するものとして定義されており、例えば、ハット(^)やドル記号($)はそれぞれパターンマッチさせる対象の文字列の先頭および末尾を表します。

従って、文字列の先頭を示すハット(^)を足した新たな正規表現 ^flo..?rflower/flour/floor などの先の例で示す正規表現 flo..?r にマッチする特定の表現で始まる文字列にのみマッチするようになります。そして、先頭が正規表現 flo..?r にマッチしない sunflower という表現で始まる文字列や、冒頭に示した二つの文字列 (it's coming up like a flower 及び a flower in bloom) にはマッチしません。

同様に、文字列の末尾を示すドルを足した新たな正規表現 flo..?r$ は先の例にあげた3つの文字列や sunflower で終わる文字列、あるいは冒頭に示した文字列のうち、it's coming up like a flower には引き続きマッチするものの、flo に続く2もしくは3文字目の r で終わらない flooring が最後に来る文字列や、冒頭に示したもう一方の文字列 (a flower in bloom) にはマッチしません。

その他、よく使う記号として、直前の表現が1回以上続く文字列にマッチすることを示すプラス(+)と直前の表現が0回以上続く文字列にマッチすることを示すアスタリスク(*)があります。
例えば、正規表現 go+gleg の後に o が1回以上連続して続き、その後に gle と続く特定の表現を含む全ての文字列にマッチします。
すなわち、goglegoooogle, gooooooooogle などの特定の表現を含む文字列にマッチします。
正規表現 go*gle は上記の文字列の他に ggle という特定の表現を含む文字列にもマッチするのに対し、go+gle はそのような文字列にはマッチしません。

正規表現はこれだけではありません。

ピリオドが任意の一文字にマッチするのに対し、ある特定の種類の一文字にだけマッチさせたい場合は、角カッコを使います。
例えば、任意の数字一文字にマッチさせるためには [0123456789] とします。
角カッコでくくられた文字群の何れかにマッチすることを意味します。
更に、0から9まで、とか、aからzまで、などの範囲を示すために、ハイフンを利用できます。
先の任意の数字一文字にマッチさせるための正規表現は、従って [0-9] と表現出来ます。
任意の数字、大文字、小文字の何れか一文字にマッチさせるための正規表現は [0-9a-zA-Z] と表現できます。

おまけにもう一つ、丸カッコと縦棒(|)の使い方について説明しておきます。
これまでの正規表現は文字単位でしたが、ある特定の文字列をひとまとまりにして扱うために丸カッコが用意されています。
sun という文字列が1回以上出現して、その直後に flower が続くという特定の表現を含む文字列にマッチさせたい時には (sun)+flower と書けます。
これで、sunflower だけでなく、sunsunflowersunsunsunflower という特定の表現を含む文字列にマッチします。

縦棒は、「もしくは」の意味で用いられます。すなわち、of, the, a, an の何れかにマッチさせたい時の正規表現として、(of|the|an?) と書くことが出来ます。
ですから、マッチ対象の文字列の先頭が、以上の何れかの表現(特定の表現)を含むものとしたい時の正規表現として ^(of|the|an?) と書けます。

もっと知りたい?

正規表現について更に詳しく知りたい場合は、ネットの検索エンジンで調べてみたり、あるいはテキストを読んだりすることをお薦めします。
ただしネット上の説明には間違っているものもあるので注意して下さい。本ページの記述に誤りを見つけた場合にはお知らせ頂けますと幸いです。
連絡先は、yy アット dbcls ドット jpです。よろしくお願いします。