From: Tanaka Akira Date: 2003-05-27T13:10:11+09:00 Subject: [ruby-dev:20293] Re: /()*\1/ =~ "" In article <5FD2F0CF7F5D7F44B00F36870B9E78B508DE502F@SBG-EX4>, kkosako@softbank.co.jp writes: >> つまり、たとえば、 >> /(?:()|a)*/ =~ "a" >> が "a" にマッチする ($0 が "a" になる) として、() がマッチした位置 >> ($~.begin(1), $~.end(0)) は 0 になるのか 1 になるのか、ということです。 >> >> まぁ、どっちだろうと全体がマッチするかどうかには関係ないといえばそうな >> んですが。 > > 確かにそういう問題がありました。 > 位置が違うということは、選択子の選択順序が違っているということになります。 順序というか、() が位置 0 にマッチした後、位置 1 にマッチすることで状 態が変化するかどうかの違いというつもりなんですが。 状態に位置を含めると、位置 1 にマッチすることにより状態が変化するわけ ですが、capture した文字列の内容のみを考えるなら、位置 1 にマッチして も状態が変化しないので。 > 対処方法を考えてみたのですが、実行コストが高そうなので、 > あきらめて現状の仕様のまま(無限の繰り返しで空にマッチすると繰り返しは中断す > る) > ということになりそうです。 ふむ。 >> また、/(?:()|a)*/ =~ "a" で $0 が "" になるような場合にはこんなことは >> 起こらないのかも知れません。 > > そうなるような実装にするつもりでした。 > その場合でも何も対処しないと、/(?:()|a)*$/ =~ "a" のとき同じ問題があるような > 気がしますが、 > これを問題だと思うのは考え過ぎ? こんな例を考えつきました。 /(?:\1a|())*/ =~ "a" $0 は "" になるのか "a" になるのか、また、 $~.begin(1) は 0 になるのか 1 になるのか、さて? -- [田中 哲][たなか あきら][Tanaka Akira]