【Ruby入門】文字列の置換方法まとめ(gsub sub regex)

どうも、フリーエンジニアの長瀬です。

文字列の置換というのはRubyの処理を行う上でよく使用します。ただ置換のメソッドをしっかり覚えている方というのはなかなかいないのではないでしょうか?

そこで今回は、Rubyで文字列を置換するメソッドについてまとめてみました。これを読めば、文字列の置換をすんなりできるようになります!

目次

一箇所だけ置換

shutterstock_405132310
文字列の置換は正規表現を用いて行います。正規表現についてはこの記事の後半で説明を加えてますので、全くわからない方はそちらを参考にしてください。

まずは、正規表現に初めてマッチした部分を一箇所だけ置換するメソッドを紹介していきます。

sub

subはマッチした最初の一箇所を置換するメソッドです。

文字列.sub(/正規表現/, '変換後の文字')

という風に書きます。

例えばrubyという文字をpythonに変換したい時は

string = "ruby ruby ruby"
puts string.sub(/ruby/, 'python')

[実行結果]

python ruby ruby

マッチした初めの一箇所が変化していることがわかるでしょうか。

sub!

sub!は破壊的メソッドと呼ばれるメソッドです。破壊的メソッドはレシーバそのものを変更してしまうメソッドのことです。
subとsub!の処理の違いを見比べてみましょう。

string = "ruby ruby ruby"
string.sub(/ruby/, 'python')
puts string

string.sub!(/ruby/, 'python')
puts string

[実行結果]

ruby ruby ruby
python ruby ruby

一度目のsubメソッドの処理ではレシーバであるstringは変化していないことがわかりました。二度目のsub!メソッドの処理ではレシーバのstringの値ごと変化していることがわかります。

メソッド名に「!」が付いていると、破壊的メソッドという慣習があるので、覚えておくようにしましょう!

一括で変更

shutterstock_385671838
次に一括で変更する方法について見ていきます!

gsub

gsubは正規表現にマッチした部分をすべて変換するメソッドです。

string = "ruby ruby ruby"
puts string.gsub(/ruby/, 'python')

[実行結果]

python python python

subでは初めのrubyしか置換されていませんでしたが、gsubではすべてのrubyが置換されていることがわかります。このように一括で置換したい時はgsubを使用するようにしましょう!

gsub!

gsubの破壊的メソッドがgsub!です。

string = "ruby ruby ruby"
string.gsub!(/ruby/, 'python')
puts string

[実行結果]

python python python

このようにレシーバ自身が変更されていることがわかります。

正規表現(regex)を使ったgsub

正規表現とは

正規表現は文字列のパターンをマッチングさせて変更したり、削除したり、マッチングしたものを使って新しい文を生み出したりと柔軟な使い方ができる優れものです。

なのでプログラマーや学生を始め、ものを書く人なら覚えておいて損はありません。正規表現はたくさんの特殊記号を使用してパターンをマッチングを行うので始めはそ記号を覚えるのに苦労します。

ただなんども自分で打ち込んでいるうちに覚えてしまうので、練習あるのみです。

こちらではgsubを使った、正規表現によるマッチングの例を紹介しますがまず正規表現に関する知識が必要なので、正規表現がわからないまたは曖昧な理解にとどまっている方はこちらの記事をまずはお読みください。

基本記号

応用編

部分的にマッチングした値を取り出す(グループ化)

文字列の中で特定の部分だけを抜き出して後から使いたいときにはグループ化を使いましょう。

グループ化を理解するにはサンプルコープを確認するのが一番です。

s = "Rubyist is the sexiest engineer."
puts s.gsub(/A(w*).*thes(w*)s.*/,'1 2')

[実行結果]

Rubyist sexiest

このように今回は”Rubyist is the sexiest engineer”という文字列から、文頭の”Rubyistと”sexiest”だけを取り出しています。

今回正規表現に関しての説明は省きますが(w*)で文字をとらえています。グループ化したいときは()で囲みます。そして()で捉えた文字は1、2のように順番に格納されているので出力の際に使用することができます。

今回は1に”Rubyist”、2に”sexiest”が格納されたので’1 2’として出力しています。

キーワードを指定してマッチングした値を取り出す(グループ化)

先ほど紹介したグループ化では、実はマッチングした値に特別に名前をつけることもできます。

その際には()で囲んだ先頭に?<グループの名前>を入れるだけです。

そして取り出すときは、1や2ではなく、指定した名前で取り出せます。

s = 'apple banana cone doughnut'
puts s.gsub(/(?w*)s(?w*)s(?w*)s(?w*)/,'k k k k')

[実行結果]

doughnut apple banana cone

k<指定した名前>で取り出せていることを確認できます。

今回はそれぞれ単純にa、b、c、dとグループに名前をつけてみました。

ハッシュを使った複数の文字の置き換え

次はハッシュを使ったgsubです。

ハッシュを使えば、指定した文字を一気に置換できて非常に爽快です。

s = 'abcd'
puts s.gsub(/[abcd]/,"a"=> "apples","b"=> "bananas","c"=> "cones","d"=> "doughnut")

[実行結果]

apple banana cone doughnut

[]の中で変換したい文字を指定して、その後にハッシュとしてどう変換するのか指定します。今回はa、b、c、dをそれぞれ食べ物で置換してみました。

文字を一気に置換する際には使えます。

ブロックを使ったgsub

gsubではブロックに、マッチングした文字列を渡せます。

ブロックに渡せると、案外なんでもできてしまいますので、非常に便利です。

s = 'apple banana cone doughnut'
puts s.gsub(/w*z/){|string| string.split('h')[1]}
puts s.gsub(/Aw*s/){|string| string*3}

[実行結果]

apple banana cone nut
apple apple apple banana cone doughnut

このように、1番目の例では最後のdoughnutをマッチングさせてhでsplitした後に後方の要素(nut)を取り出しています。

また2番目では先頭のappleをマッチングさせて3回繰り返してます。

Rubyを独学で頑張っているけど先が見えない方のために

独学でRubyを頑張っているわけだけど、先が見えない・・・

そんな方、実はいらっしゃるのではないでしょうか?

いや、おれは違うぞ。先のキャリアもしっかり見えてるし、独学の成果も出てきている

そんな方であれば、これから先の話は必要ないでしょう。そっとページの閉じるボタンを押しましょう。

しかし、「先が見えない」と心の底では勘付いているそこの奥さん。この先を読み進めて、一緒に課題を深堀りしていきましょう。

なぜ「先が見えない」という不安や悩みを抱えてしまうのか

さて、「一寸先は闇だ・・・」とお悩みを抱えている方に、なぜ独学でRubyを勉強しているにもかかわらず、そのような現状を抱えてしまうのか、一緒に考えていきましょう。

先が見えない現状を踏まえ、課題として考えられるものは以下のどれかに該当するでしょう。

  • プログラミングの上達が見えない
  • プログラミングを継続できない気がする
  • プログラミングスキルを習得した姿がイメージできない
  • プログラミングスキルを活かした仕事を獲得するイメージができない

これらのどれかに該当することによって、「なんとなくプログラミング学習をしている」という状態になってしまいます。

これらの要因は、三日坊主になる理論と同じなんですが、「プログラミング学習をしなきゃ」とプログラミング学習を頑張ってしまっている状態になってしまっています。

受験勉強をやった経験のある方なら頭がもげるほどに首を縦に振ってしまう方も多いのですが、「今日も5時間勉強するぞ」や「今日はこの章を終わらすぞ」というように、学習を進めることに意識が行き過ぎてしまうと、ある程度学習を継続した後に「先が見えない・・・」となってしまいます。

未来に光を当て、プログラミング学習を「成果が出るもの」にするために

先ほど、「なぜ先が見えないという悩みや不安を抱えてしまうのか」という疑問に対しての答えを示していきました。

これらの課題というのは、独学をしていれば9割の方がぶつかってしまう壁だそうで、いわば、あるあるの現象なのです。

独学をしていて、「なんか前に進めていないぞ」と感じるのはこのせいなんですね。甘く見がちですが、非常にやっかい。

これがさらにやっかいさを極めているのは、上記に挙げた課題のほとんどが、1人で解決できないものばかりだからです。

実は、これらのほとんどが経験者に助けてもらいながら解決しないと、すぐに違う方向へと流れてしまいます。

そう言い切れるのは、以前の私もそうだったからです。

エンジニアやプログラマー関連のキャリアに詳しい方や現役のエンジニアに相談しながら修正を加え、学習を実践して今があります。

そうは言っても、周りにそういう人がいないし・・・

という方もいるでしょう。そういう時にこそ、プログラミングスクールの無料カウンセリングを利用するのです。

営業をかけられて時間の無駄に終わるでしょ?

という考えに辿りついてしまいますよね。結論から言うと弊社では、そういった強引な営業等を行うことはありませんので、安心して受講できます。

「プログラミング学習の先ある未来」を光で明るく照らすには、弊社の無料カウンセリングがぴったりだと断言できます。それくらい無料カウンセリングに自信を持っているのです。

さらに、無料カウンセリングには以下の3大特典もついてきます!

  • 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
  • 効率的なオリジナル学習カリキュラム
  • 未経験の転職(フリーランス)を可能にするキャリアサポート

上記の特典だけでも他のスクールにはないポイントだと自信を持っている無料カウンセリング特典です。

ただプログラミング学習をする毎日から、ワクワクしながらプログラミング学習できる毎日に変える体験を一度でいいのでしてみませんか?

無料カウンセリング予約はこちら

まとめ

今回は文字列の置換について解説していきました!
subとgsubというメソッドがあり、それぞれの使い分けについてわかっていただけたと思います!

置換には、正規表現の知識が必須になるので、ぜひこの機会に習得してみてください。前述したように、正規表現は特殊記号づくめのくせものですので、なんども自分で入力して苦労して覚えましょう。

もし、正規表現やRubyの置換メソッドをわすれてしまったらこの記事を見直して復習しましょう。

Rubyの文字列をしっかり理解したい方に

この記事は文字列を体系的に解説した3ステップで簡単! Rubyの文字列を 完全理解の一部となります。
文字列をさらに理解したい方はこちらを読んでどんどん理解を深めていくようにしましょう。

この記事を書いた人

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。

目次