[#46093] 質問:mingw環境でのtcltklib.soのコンパイル — Dice <rubyist@...>

Diceです。

12 messages 2009/06/16

[ruby-list:46103] Re: gsub における '&' の挙動

From: KIMURA Koichi <kimura.koichi@...>
Date: 2009-06-18 01:57:35 UTC
List: ruby-list #46103
木村です。

すでに解決しているところですが

On Thu, 18 Jun 2009 08:01:24 +0900
"Hideo Konami" <konami@kyoto-wu.ac.jp> wrote:

> s = "abc_def  &ghi 125$"
> s = s.gsub('_','\_')
> p s
> s = s.gsub('$','\$')
> p s
> s = s.gsub('&','\&')
> p s
> 
> 結果
> "abc\\_def  &ghi 125$"
> "abc\\_def  &ghi 125\\$"
> "abc\\_def  &ghi 125\\$"

行末(文字列末尾)だけ特別扱いになってしまいますが、同じような置換を
複数回行うのであればこういうやり方もあるということで。

irb(main):001:0> s.gsub(/[_&]|\z/, '\\\\\\&')
=> "abc\\_def \\&ghi 125\\"

もっともさすがにこれは '\' がうるさすぎるのでブロックを使って

irb(main):002:0> s.gsub(/[_&]|\z/){ '\\' + $& }
=> "abc\\_def \\&ghi 125\\"

でしょうか。

> ついでに: gsub! を使えば元の文字列の破壊的置換ができ
> ますが,置換すべき文字列がない場合には nil が返るので,
> 上のように自己代入的な書き方にしています。あんまり
> スマートではないのですが,次のようなのもいまいちですよね。
> 
> s.gsub!(s1,s2) if s.index(s1)
> 
> せっかくの破壊的置換が使いにくいというのは残念に思うの
> ですが・・・ 

gsub! をメソッドチェーンの中においても問題なく使えるようにしてほしい
というのは何度となく挙げられる要望ですが、採用に至ったことはないですね。

ただ、上記の例では index を使う意味がないような。
置換が行われなかったときのgsub! の戻り値が nil になるだけであって、
対象文字列そのものが nil とか空文字列になるわけではないですから。

irb(main):003:0> s = '123'
=> "123"
irb(main):004:0> s.gsub!(/[A-Z]/, '*')
=> nil
irb(main):005:0> s
=> "123"
irb(main):006:0> s.gsub!(/\d/, '*')
=> "***"
irb(main):007:0> s
=> "***"

-- 
木村浩一


In This Thread

Prev Next