正規表現において、空文字はどうやら特別扱いされています。
例によって調査結果を元に動作を推測していますので、誤りがあればご指摘下さい。m(_ _)m
abc
に対して
.*
とすると何がマッチするだろうか?
答えはabcと空文字です。なぜ空文字がマッチするのだろうか?
実験すると、
^.*
だとabcにしかマッチしない。
.*$
だとabcと空文字にマッチする。ということは空文字が$の直前にあるようだ。
調査・・・調査・・・調査・・・
どうやら正規表現上、abcというのは以下のように考えられるとのことだ。
行頭 空文字 a 空文字 b 空文字 c 空文字 行末
要するに間に全部空文字が入っているわけだ。
.*はできるだけ長い文字列にマッチするから、
空文字 a 空文字 b 空文字 c 空文字
にマッチしている。つまり、abcだ。次に残ったのは行末だ。この検査対象の行末の前にも空文字があると考え、実際には、空文字+行末に対してマッチングを行うことになる。この結果、.*は.の0回繰り返しとなり、空文字がマッチする。マッチを2回にわけて考えれば、
行頭 空文字 a 空文字 b 空文字 c 空文字
でマッチ、
空文字 行末
でマッチとなったわけだ。上記だと
行頭 空文字 a 空文字 b 空文字 c 空文字 空文字 行末
と行末に空文字が2つ続くイメージになるが、空文字は元々存在せず、検査する際には常に存在すると考えるのであろう。それに空文字なのでいくつあっても空文字一つと同じである。というより何個という概念がない。(虚数のような感じか?)
以上のように考えると、^.*が空文字にマッチしなくて、.*$がマッチするのも説明が付く。
では、
abc
に対して
b*
とすると何がマッチするだろうか?
答えは、空文字、b、空文字、空文字である。
動作的にはたぶんこうだ。
行頭の次の空文字はbの0回の繰り返してでマッチ。・・・(1)
次のaはマッチしようがないのでスキップ。
次の「空文字 b 空文字」はbと考えられるのでbの1回の繰り返しでマッチ。・・・(2)
残りは「空文字 c 空文字 行末」。
よってcの前の空文字がマッチ。・・・(3)
cはマッチしないのでスキップ。
残りの「空文字 行末」で空文字がマッチ・・・(4)
以上より、空文字、b、空文字、空文字がマッチすることになる。
#以上のこと合ってる? >みなさん。