The road to C# master trapemiya

C#を中心に、.NETの話題を取り上げます。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  256  : 記事  1  : コメント  10763  : トラックバック  30

ニュース

Since 2005年10月26日

わんくま同盟

わんくま同盟

Microsoft MVP


Visual Developer - Visual C#

記事カテゴリ

書庫

日記カテゴリ

2009年4月24日 #

正規表現において、空文字はどうやら特別扱いされています。
例によって調査結果を元に動作を推測していますので、誤りがあればご指摘下さい。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、空文字、空文字がマッチすることになる。


#以上のこと合ってる? >みなさん。

posted @ 16:39 | Feedback (41)