正規表現のおさらい (2)

正規表現のおさらいシリーズ
その1:http://developer.venture-net.co.jp/entry/2018/06/22/174206
その3:http://developer.venture-net.co.jp/entry/2018/07/06/185719
その4:http://developer.venture-net.co.jp/entry/2018/07/13/185653

前回の記事正規表現のごくごく基本をおさらいしましたので、今回もう少し進んでおさらいしてみたいと思います。

任意の一文字にマッチする - . (ピリオド)

| (縦棒) を使うことで、どれかにマッチするという正規表現を記述できました。
ha((ve)|s|d) と書けば、have、has、had のいずれにもマッチさせることができます。
もし、そのバリエーションがもっとたくさんあって、 どれ と限定することができない場合は、任意の一文字にマッチする . (ピリオド/ドット) というメタ文字を使います。

これを使って ha. と書いた場合は、hai hae ham hap などなど、ha のあとにどんな文字が来てもマッチします。
また h.s と書いた場合には、has his hes hvs など、h と s の間にどんな文字が来てもマッチすることになります。

もちろん . は続けて書くこともできます。 h.. と書けば、h のあとにどんな二文字が来てもマッチするということになります。

どれか1つにマッチする - [] (角かっこ)

. を使うとすべての文字にマッチしますが、すべてではないものの全部にマッチさせたいわけではない場合には、[] (角かっこ) を使うことができます。 h[aiev]s と書いた場合には、has his hes hvs にマッチし、haas hos hs などにはマッチしません。[] の中のどれか一文字にマッチします。
これだけなら h(a|i|e|v)s と書くこともできますが、[
] の特徴は文字の範囲指定ができることと、それを含まないという表現ができることです。

[] では文字の範囲をハイフンを用いて指定することができ、例えば h[a-d]s と書いた場合は、has hbs hcs hds にマッチします。つまり [a-d] は a b c d のどれかということになります。

そして、[] の中で先頭に ^ をつけた場合、例えば h[^a]s と書いた場合は、「hの次にa以外の文字が来てsが来た場合」をあらわします。
ですから h[^a]s の場合は、his hos hes などにマッチし、has にはマッチしません。 h[^a-d]s と書いたなら、his hos hes などにマッチし、has hbs hcs hds にはマッチしないということになります。

これを使えば、「アルファベット一文字」は [a-zA-Z] とあらわすことができます。数字一文字は、[0-9] とあらわすことができます。

決まった繰り返し回数 - {} (大かっこ)

繰り返しを指定するものとしては、? が0か1回、+ が1回以上、* が0回というのは前回おさらいした通りです。
{} を使うと、決まった回数の繰り返しを指定することができます。 例えば a{3} などと書きます。{3} であれば、{3} の直前が3回連続してあらわれた場合を意味します。したがって a{3} であれば aaa にマッチします。 a+ の場合、a や aa にもマッチしますが、a{3} では a や aa はマッチしません。

さらに、{1,3} などの書き方をすることができ、この場合は「1回以上3回以下」のように回数の範囲を表現することができます。
a{1,3} であれば、a aa aaa にマッチします。aaaa にはマッチしない - と勘違いしてしまいそうになりますが、a{1,3} だけであれば、aaaa の場合は最初の三文字の aaa 部分にマッチします。
xa{1,3}x であれば、xax や xaax にマッチしますが、xaaaax にはマッチしません。