基本正規表現について

今回「新しいLinuxの教科書」という名著で正規表現を勉強したので、アウトプットしようと思います。
まず

yeah
year
yeahh
yeahhh
yeahyeah
yeahyeahyeah

というテキストファイルがあったとします。
[year]と[year]という単語を抽出したいときに、使うのが「.(ドット)」です。
「.(ドット)」は任意の1文字にマッチするメタ文字です。

'yea.'

なので、上記のようにすると[yeah]や[year]はもちろん[yead][yeaa]などにもマッチします。
しかし、「.(ドット)」のある部分は最後の1文字なので[yerh]や[yeeh]にはヒットしませんし、[yeahh]にもヒットしません。
では、[yeahh]や[yeahhh]にマッチさせるにはどうしたら良いかというと、「*(アスタリスク)」を使います。
「*」は0回以上の繰り返しにマッチします。例えば

'yea.*'

とすると[yeah]や[yeahh],[yeahhh]にマッチします。また、0回以上なので[yea]にもマッチします。
また、間に「.」を入れて[yeah][yeeah]にマッチさせることも可能です。
さらに、特定の文字を指定することもできます。
しかし今までの場合だと[yeah][yead]や[yea!]にもマッチしてしまいます。
そうではなく、[yeah]と[year]のみにマッチさせたい場合は

(1) 'yea[hr]'
(2) 'yea[^hr]'

(1)とすることで、最後が h か r の単語のみをマッチさせることができます。
また(2)のようにすると h と r 以外の文字を最後に使っている単語をマッチさせることができます。

あとは、[yeahh]にはマッチさせたいんだけど[yeahhh]にはマッチさせたくない。
[yeah]と[yeahh]にはマッチさせたいんだけど[yeahhh]にはマッチさせたくない。
など細かな指定もすることができます。

(1) '\{m,n\}'
(2) '\{m\}'
(3) '\{m,\}

まず、(1)のようにするとm回以上n回以下の繰り返しにマッチさせることができます。
なので、[yeah]と[yeahh]だけにマッチさせたかったら'yeah\{1,2\}'とするとマッチさせることができます。
(2)の場合はちょうどm回繰り返しの単語のみマッチできます。
'yeah\{2\}'とすると[yeah]にはマッチせず、[yeahh]にのみマッチします。
最後(3)はm回以上の繰り返しにマッチします。
'yeah\{3,\}'とすると[yeahhh]や[yeahhhh]にマッチします。
[yeah]や[yeahh]にはマッチしません。

次に行頭、行末指定について書こうと思います。
今までの通りやっていくと[yeah]にマッチしているけど[yeahh]までマッチした対象として出てきてしまう。といったことがあると思います。
それは[yeahh]の"yeah"の部分にマッチしているためです。
なので[yeahyeah]などにもマッチしてしまいます。
そこで指定するのが行頭/行末です。

(1) 'yeah$'
(2) '^yeah'

「^」は行頭を『$」は行末を意味します。
なので(1)の場合は、 [yeah]で終わるもののみにマッチします。[yeah]はもちろん、[ayeah]や[yeahyeah]などにマッチします。
(2)の方は逆に行頭を意味します。
[yeah]で始まるもの、[yeahh]や[yeahh]、もしくは[yeahyeah]にもマッチします。
しかし、行頭指定なので[aayeah]など先頭に[yeah]以外の文字が入るものにはマッチしません。

最後に [yeahyeah]はいいけど[yeahyeahyeah]は嫌なんだ、という指定にも正規表現は応えてくれるという事を紹介して終わろうと思います。

(1) '\(\)'
(2)'\(yeah\)'
(3)'^\(yeah\)\{2\}$'

例題文を(3) にまとめておきました。
(1)は基本的な構成です。
(2)のように(1)に当てはめる事でyeahを グループ化 しています。
グループ化することにより、全体に対して繰り返し等の指定をすることができます。
(3)はこの記事の総まとめみたいな例文です。
読み解いていくと

行頭から始まり「^」グループ化「\(\)」した[yeah]を
2回ちょうど繰り返していて「\{2\}」、その後行末である。

これで[yeahyeah]のみにマッチする文になりました。


今回はこれでまとめを終わろうと思います。
基本正規表現の基本的な扱い方についてまとめました。
拡張正規表現という便利なものもあるので、機会(モチベーション)があればまた、まとめようと思います。



最後になりますが、正規表現は色々な書き方があって出来上がったものだけ見るととても難しいですが、一から勉強して、読み解いていくととても面白いものなのでこれからも自分自身勉強していこうと思います。
皆さんも色々なパターンを試して楽しんでください。
また、プロの方々、ミス や ここ違うんじゃないの? といったことがあればコメントやツイッターで指摘/アドバイスください。
お願いします。