7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

gsubでマッチした部分を置き換え文字の生成に利用したい

Last updated at Posted at 2016-11-18

gsub(pattern, replace)patternにマッチする部分をすべてreplaceに置き換えてくれる便利メソッドです。patternとして正規表現、replaceとして文字列をそれぞれ指定することが多いと思いますが、実はブロックを持つこともでき__「patternでひっかけた部分をこねくりまわしてreplaceにしたい」__というときにはとても便利です。

たとえば英数字からなる文字列のうち、aとcだけをすべて大文字にする場合は次のように書くことができます。

p "1a2b3c".gsub(/[ac]/){|ch| ch.upcase} #=> "1A2b3C"

余談ですが、Rubyでは「暗黙のProc化」とでもいうべき裏機能(?)があります。これは&objのようにアンパサンドを先頭に付与した場合、それに続くobjProcとして扱おうとするというもので、なかでも&:symbolのよう「アンパサンド + Symbol」という組合せはよく使われます。

たとえば文字列配列の中身をすべて整数に変換したい場合、この「暗黙のProc化」を利用して次のように書くことができます。

words = ["1", "2", "3"]
p words.map{|ch| ch.to_i} #=> [1, 2, 3]
p words.map(&:to_i) #=> [1, 2, 3]

この例ではmapメソッドのブロックを&:to_iで代用しています。ブロックありのgsubもこれと同じにようにブロックを省略し、「暗黙のProc」で代用することができます。つまり最初の例は次のようにもかけてしまうということになります。

p "1a2b3c".gsub(/[ac]/, &:upcase)  #=> "1A2b3C"

ブロックをわざわざ書く必要がない分、とてもらくちんですね(`・ω・´)シャキーン

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?