Ruby
Rails
初心者
RubyOnRails
初心者向け

[初学者]subメソッドとgsubメソッドで文字を置換する

目的

  • 人のコードを読んでいるときに「gsub」が分からなかったので調べた内容メモ

条件

  • ruby 2.4.1

目次

  • subメソッドとは
  • gsubメソッドとは
  • gsubメソッドのスニペット

subメソッドとは

subメソッドは指定したパターンにマッチした最初の部分を特定の文字列に置換します。パターンには文字列や正規表現が使えます。

irbでやってみた
# 変数aに'shimada-shimada'を代入
a = 'shimada-shimada'

# 'shimada-shimada'の最初の'shi'を'ya'に置換する
a.sub(/shi/, 'ya')
# 第1引数に最初にマッチした置換されるパターン文字(正規表現)を指定
# 第2引数に置換したい新しい文字列を指定


結果
=> "yamada-shimada"
# 最初にマッチした'shi'が'ya'に置換される
ブロックをとる場合
# 変数aに'shimada-shimada'を代入
a = 'shimada-shimada'

# 'shimada-shimada'の最初の'shi'を'ya'に置換する
a.sub(/shi/) {|str| 'ya'}

結果
=> "yamada-shimada"
# 最初にマッチした'shi'が'ya'に置換される

---
a.sub(/\w+/) {|str| str.upcase}

結果
=> "SHIMADA-shimada"
# 最初にマッチした'shi'のブロックを大文字にする

gsubメソッドとは

gsubメソッドはマッチしたすべての部分を特定の文字列に置換します。パターンには文字列や正規表現が使えます。

irbでやってみた
# 変数aに'shimada-shimada'を代入
a = 'shimada-shimada'

# 'shimada-shimada'の最初の'shi'を'ya'に置換する
a.gsub(/shi/, 'ya')
# 第1引数にマッチした置換されるパターン文字(正規表現)を指定
# 第2引数に置換したい新しい文字列を指定


結果
=> "yamada-yamada"
# 全てマッチした'shi'が'ya'に置換される
ブロックをとる場合
# 変数aに'shimada-shimada'を代入
a = 'shimada-shimada'

# 'shimada-shimada'の最初の'shi'を'ya'に置換する
a.gsub(/shi/) {|str| 'ya'}

結果
=> "yamada-yamada"
# マッチした'shi'が'ya'に置換される

---
a.gsub(/\w+/) {|str| str.upcase}

結果
=> "SHIMADA-SHIMADA"
# マッチした'shi'のブロックを大文字にする

gsubメソッドのスニペット

  def normalize(str)
    str.strip                                    # 前後の空白除去
       .tr("0-9a-zA-Z  ()-−", "0-9a-zA-Z  ()-")  # 全角英数字を半角に
       .gsub("\t", ' ').gsub(/ +/, " ")          # 空白を単一半角スペースに統一
       .gsub("\r\n", "\n").gsub("\r", "\n")      # 改行を\nに統一
  end

まとめ

いろいろ調べてみると「gsubメソッド」は結構使いそう。あと「正規表現」

参考

第6回 正規表現と文字列の置換
subやgsubで括弧とマッチした部分の再利用、および式展開の方法