From: Wakou Aoyama Date: 2001-12-19T05:59:32+09:00 Subject: [ruby-dev:15495] Re: gsub weirdness: gsub(/.*$/, "foo") 青山です。 On Tue, Dec 18, 2001 at 06:21:28PM +0900, Akinori MUSHA wrote: > 正規表現エンジンはいじらず、 gsub()/scan() などのカーソルの動かし > 方もそのままに、繰返しの中で前回のマッチの終端の空にマッチしたら > 捨てて次へ行くという挙動を考えていました。 可能なようにも思えますが、後方を気にしながらよりも、このような場合には、 いっそ、$ つまり (?=) を使わなければ、カーソルは先へ行ったままになるの で、それで良さそうな気もします。 $ ruby -e 'p "abc\ndef\n".gsub(/.*(\n)/, %q|x\1|)' "x\nx\n" Perl 4 の頃には (?=) などはありませんでしたから、/()/, \1 という手法は 良く使っていました。 また、このように複数行を扱う時には、$ も、このように混乱する場合がある ので、複雑な対策を考えるよりも、\n と記述してしまって、/(\n)/, \1 とし てしまっていました。 >  そもそも空にマッチしうるパターンには注意が必要ということを > 踏まえると、注意と工夫次第で避けられるという気はしてきました。 そうですね。たまたま最初のメールが、こういうものでしたっけ? という、 挙動の確認のような話しだったので、対策の話しが遅れましたが、上記のよう に、そういうものだ、と思って別解へ向かってみると、結構簡単に対策は出て 来ます。 >  今回はたまたま sed, perl, ruby の正規表現の挙動について確認 > していたら一見奇妙な結果を得て思わず投げてしまっただけなので、 > 具体的に困っているわけではありません。 > >  /.*$/ の意図はおそらく /^.*/ でしょうし、 /a*$/ も置換なら > /a+$/ に対して行うのが普通でしょう、ということで納得します。 なるほど、そうでしたか。最初のメールが、確認、という感じでしたので、あ のように続けてしまいましたが、もし、確認ではなく、提案、というつもりだっ たとしたら、せっかくの良さそうな案を止めるようで申し訳ないな、という気 持もしていました。 現状としては、そのようなもの、と納得するしかないような気がしますが、将 来的には、何か解法が得られるといいですね。 -- 青山 和光 Wakou Aoyama