箱のプログラミング日記。

えんじにあ奮闘記

文字列の一部を削除したい【delete / gsub】

f:id:y_hakoiri:20191102134313j:plain

Railsで開発していて渡ってきた文字列を操作したいなーと思った箇所があったのでメモ。

deleteメソッド

delete(*strs) -> String

self から strs に含まれる文字を取り除いた文字列を生成して返します。

引用:String#delete (Ruby 2.7.0 リファレンスマニュアル)

その名の通りdeleteしてくれる。

arrayに使うイメージが大きかったけど、文字列に対しても引数で渡した値を削除できる。

pry(main)> string = "next_page"
=> "next_page"
pry(main)> string.delete("next_")
=> "pag"

next_pageという文字列のnext_のみ消してpageにして欲しかったんだけど、deleteに渡した引数は完全一致とかじゃなく1文字ずつ判断され、マッチするすべての文字を削除してくれてしまうので、pageのeも消えてpagが返ってきた。

こういう場合はgsubを使用するべき(後述)

ちなみに、deleteに渡す引数を指定すると、どちらの条件もクリアした文字列のみが削除される。

pry(main)> string = "next_page"
=> "next_page"
pry(main)> string.delete("next_")
=> "pag"
 pry(main)> string.delete("next_", "ex")
=> "nt_pag"

gsubメソッド

gsub(pattern, replace) -> String

文字列中で pattern にマッチする部分全てを文字列 replace で置き換えた文字列を生成して返します。

引用:String#gsub (Ruby 2.7.0 リファレンスマニュアル)

gsubメソッドは第一引数に正規表現を用いて、マッチする部分を第二引数の文字列に置き換える(replaceする)メソッド。

「e」とかの文字単位ではなく文字列でマッチした部分のみ消してほしい時はこちらを使用。

pry(main)> string = "next_page"
=> "next_page"
pry(main)> string.gsub(/next_/, "")
=> "page"

リファレンスにもreplaceとある通り「置き換える」が前提だけど、第二引数で空文字を与えることで、結果的に正規表現で指定した箇所を消すことができる。

今まであんまり使ったことなかったけど、文字列の一部を取り出してreplaceして...みたいなことはどこかでやったことある気がする。あれをgsubだけで書けるのは非常に便利。

破壊的メソッド

deleteもgsubもレシーバ自身を書き換える破壊的メソッドが使える。

replaceは破壊的メソッドがなくて、元々書き換えまでしてくれるメソッドなのでそこも違いの一つ。

まとめ

  • deleteメソッドは一致した文字全てを削除
  • gsubメソッドは正規表現を使用しマッチした文字列を削除
  • gsubメソッドの第二引数に空文字を与えると文字列の一部分だけを除くことが出来る

参考

String#delete (Ruby 2.7.0 リファレンスマニュアル)

String#gsub (Ruby 2.7.0 リファレンスマニュアル)

文字列の一部を削除する - Ruby Tips!