From: Akinori MUSHA Date: 2001-12-18T18:21:28+09:00 Subject: [ruby-dev:15490] Re: gsub weirdness: gsub(/.*$/, "foo") At Tue, 18 Dec 2001 13:51:12 +0900, Wakou Aoyama wrote: > $ ruby -e "p 'a 1234 num'.index(/[0-9]*/)" > 0 > $ ruby -e "p 'a 1234 num'.index(/[0-9]+/)" > 2 > > * の場合は、空にもマッチするので、1234 の部分ではなく、最初の空にマッ > チするので、index 0 となるわけです。 > > この挙動をどうみるか、という点と、  ええと、これは正規表現エンジンとしては当然の挙動と見ていて、 > >  例えば、「gsub()/scan() など連続マッチのとき、 i..j の直後の > > j..j は除外する」という仕様もありえると思いました。つまり現状: > > これが先の例の違いである、b と (?=b) の違い、すなわち、(?=) はマッチ位 > 置を先に進めるか、という問題ですが、これを進めるようにしてしまうと、問 > 題がおこる場合もあります。 > > $ ruby -e 'p "ababab".scan(/a(?=b)|b(?=a)/)' > ["a", "b", "a", "b", "a"] > > ちょっといいかげんな例ですが、これで、もし、j..j を除外する、すなわち、 > (?=) のマッチで、直前からカーソルを移動すると、おそらく、a(?=b) にマッ > チした直後の b(?=a) はマッチしなくなり、b(?=a) の直後の a(?=b) はマッ > チしない、という動きになるように予測されます。 正規表現エンジンはいじらず、 gsub()/scan() などのカーソルの動かし 方もそのままに、繰返しの中で前回のマッチの終端の空にマッチしたら 捨てて次へ行くという挙動を考えていました。 > 従って、簡単には捨てたり進めたり、という解決はできず、挙動を変えるには、 > かなり難しい議論が必要になってくると思われます。  そもそも空にマッチしうるパターンには注意が必要ということを 踏まえると、注意と工夫次第で避けられるという気はしてきました。 > この挙動をご提案の挙動にできれば、私もわかりやすくて良いとは感じますが、 > 詳説正規表現のコラムに、そういうものだ、という感じで書かれているぐらい > ですから、改善というか、変更はかなり困難なのではないかな、と予測します。  今回はたまたま sed, perl, ruby の正規表現の挙動について確認 していたら一見奇妙な結果を得て思わず投げてしまっただけなので、 具体的に困っているわけではありません。  /.*$/ の意図はおそらく /^.*/ でしょうし、 /a*$/ も置換なら /a+$/ に対して行うのが普通でしょう、ということで納得します。  紛失した詳説正規表現をアマゾンでまた買うか。 -- / /__ __ Akinori.org / MUSHA.org / ) ) ) ) / FreeBSD.org / Ruby-lang.org Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp "Somewhere out of a memory.. of lighted streets on quiet nights.."