From: Shin-ichiro Hara Date: 1997-12-17T00:35:47+09:00 Subject: [ruby-dev:1110] Re: Regexp#operators (Re: ruby 1.1b1 released) 原です。 > 助田です。 > >原です。 > > > >しかし、私は str =~ /foo/ & /bar/ は、str =~ /foo/ && str =~ /bar/ > >と同じでなくてもいい気がするんです。「正規表現の話」なら & は && と > >同値であるべきだけど、これは「正規表現の文字列への適合の話」もからん > >でいるから同値でなくてもよい、という解釈なわけです。 > > う〜ん。なるほど、そういう解釈もありますね。多分私の違和感は逆にこの > 「同値でなくても良い」というところにあるんだと思います。 > スクリプトを読んでいるときに str =~ /foo/ & /bar/ が、 > str =~ /foo/ && str =~ /bar/ と同値であった方が、私自身は混乱しないで > すむかなあという気がします。 でも若干表現力が落ちることになりますね。例えば「英数字ただし先頭は数字 でない」は、「(?=foo)bar 方式」の & では、/\w+/ & /\D/ と書けますが 「str =~ /foo/ && str =~ /bar/ 方式」では書けません。しかしこっちの方が がすっきりしていると言えるかもしれない。 結局、正規表現自体にあいまいな所は無いのですが、=~ による文字列照合には 次の2通りの考え方があるのだと思います。 str =~ /foo/ とは(foo に ^, $ が使われていないとして)、 (A)foo という正規表現で表される文字列の集合の中で str の部分文字列になっているものがあるかを調べる。 (B).*foo.* という正規表現で表される文字列の集合の中で str と一致しているものがあるか調べる。 ここで(A)を取れば (?=) 方式、(B)を取れば && 方式、、、 と、だいたいそんな感じでしょうか。