「 0 文字以上の任意の文字」は何にマッチする?
久々に正規表現の話が出来る♪
- 正規表現における空文字は特別扱いだ。 (The road to C# master trapemiya)
とても面白い考察ですが、残念ながら違います。
実のところ、この辺の処理仕様は、詳説 正規表現を読むと判る話なんですが、さすがに NFA エンジンの細かい処理の話とかは覚えていないので、ばっさりカットします。 ^^;
なので、処理の概要だけざっくりと。
".*" に関して
"abc" に ".*" と云う正規表現を適用すると、こんな感じで処理されます。
- "abc" にマッチ(シーク開始位置を "c" の後ろに移動)
- "" ( 0 文字)にマッチ (<<対象文字列の終端を判断する前にこのマッチが成立するのは何でだっけ?)
結果、 "abc" と "" がマッチします。
"^.*" に関して
行頭から「 0 文字以上の任意の文字」のチェックなので、 1 回しかチェックされません。
なので、結果は "abc" のみ。
".*$" に関して
考え方は ".*" と一緒なので割愛。
おまけで "b*"
これが一番説明しやすそうです。(ここでも疑問はあるんだけど)
NFA エンジンの規則をそのまま当てはめればいいです。
- 文字列の先頭で "" ( 0 文字)にマッチ( 0 文字なのでシーク先が移動しない) ☆一個目
- "a" にはマッチしないのでシーク開始位置を "b" に移動
- "b" にマッチ(シーク開始位置を "c" に移動) ☆二個目
- "" ( 0 文字)にマッチ( 0 文字なのでシーク先が移動しない) ☆三個目
- "c" にはマッチしないのでシーク開始位置を "c" の後ろに移動
- "" ( 0 文字)にマッチ ☆四個目
うーん、やはり文字列終端の直前でゼロ幅マッチしているのが気になる。。。
あとでもう一回ちゃんと調べないと。
【追記】 trapemiya さんの考察を「違う」と断言するのはちょっと早計だったかも。いや、動きは↑であっているはずなんだけど。。。(疑問点が一点残ったので自信がない)【更に追記】あれ? trapemiya さんの記事を読み直してみると、基本的には間違っていない様な気がしてきた。。。