記事内にはプロモーションが含まれています

【Ruby】文字列を置換するsub・gsub・trの使い方まとめ

【Ruby】文字列を置換するsub・gsub・trの使い方まとめ Ruby

Rubyでテキストデータを処理する際、「特定の文字を別の文字に置き換えたい」「余分な空白を削除したい」といった文字列の置換(サブスティテュート)は、最も頻繁に行われる操作の一つです。

しかし、Rubyには subgsubtr といった似たようなメソッドが複数存在するため、「どれを使えばいいのかわからない」「意図した通りに置換できない」と迷ってしまうことも少なくありません。

この記事では、Rubyにおける文字列置換の基本メソッドの使い分けから、正規表現を使った高度な置換、さらには複数の文字を一括で変換する応用テクニックまで、現場で役立つ知識をサンプルコード付きで徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はプログラミングスクールを運営
  • モットーは「利他の精神」
💻 本記事の検証環境(2026年2月確認)
  • OS:Windows 11 / macOS Sequoia
  • IDE:Visual Studio / VS Code / IntelliJ IDEA
  • その他:Chrome DevTools / 各言語最新安定版

※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。

基本の置換メソッド sub と gsub の違い

Rubyで文字列の置換を行う場合、まずは subgsub の2つのメソッドを理解することがスタートラインです。

この2つは非常に似ていますが、「置換する範囲」に決定的な違いがあります。

最初にマッチした箇所だけ置換する sub

sub メソッドは、文字列の中で 「最初に見つかった」 1箇所だけを置換します。 2つ目以降にマッチする文字があっても、それらは無視されます。

text = "apple, apple, apple"

# 最初の "apple" だけを "orange" に置換
result = text.sub("apple", "orange")

puts result

実行結果

orange, apple, apple

text.sub("置換したい文字", "新しい文字") の形式で記述します。

実行結果を見るとわかる通り、先頭の “apple” は “orange” に変わっていますが、2番目と3番目の “apple” はそのまま残っています。

ファイルパスの先頭だけ書き換えたい場合や、定型文の最初の挨拶だけ変更したい場合などに便利です。

マッチした箇所をすべて置換する gsub

gsub メソッドは、文字列の中で 「マッチしたすべての箇所」 を一括で置換します。

メソッド名の g は “Global”(全体)を意味しています。実務ではこちらを使う頻度の方が高いでしょう。

text = "apple, apple, apple"

# すべての "apple" を "orange" に置換
result = text.gsub("apple", "orange")

puts result

実行結果

orange, orange, orange

text.gsub を使うと、文字列内に含まれるすべての “apple” が “orange” に置き換わりました。

文章内の表記揺れを統一したり、特定のワードをすべて伏せ字にしたりする場合に適しています。

正規表現を使って複雑なパターンを置換する

subgsub の第1引数には、固定の文字列だけでなく 正規表現(Regexp) を指定することができます。

これにより、「数字だけを消したい」「括弧で囲まれた部分を書き換えたい」といった柔軟な置換が可能になります。

数字や空白をまとめて置換する

正規表現を使うことで、特定のパターンに合致する部分を効率よく処理できます。

text = "User-12345 (Tel: 090-0000-0000)"

# 数字(\d)をすべて "X" に置換(伏せ字にする)
masked_text = text.gsub(/\d/, "X")

# ハイフンや空白、括弧などの記号をすべて削除(空文字に置換)
# [ ... ] は文字クラスで、中のいずれか1文字にマッチします
clean_text = text.gsub(/[- ():]/, "")

puts "伏せ字処理: #{masked_text}"
puts "記号削除: #{clean_text}"

実行結果

伏せ字処理: User-XXXXX (Tel: XXX-XXXX-XXXX)
記号削除: User12345Tel09000000000

/\d/ は「0から9までの数字1文字」を表す正規表現です。これを gsub に渡すことで、すべての数字が “X” に変わります。

また、第2引数に空文字 "" を指定することで、マッチした文字を「削除」することができます。

データのクレンジング(整形)において非常に強力なテクニックです。

ブロックを使って動的な置換を行う

subgsub は、第2引数の代わりに ブロック { ... } を渡すことで、マッチした文字列を使って動的に置換内容を決定できます。

text = "price: 100, tax: 10"

# 数字を見つけたら、その値を2倍にする
# マッチした文字列がブロック変数 s に入る
result = text.gsub(/\d+/) do |s|
  s.to_i * 2
end

puts result

実行結果

price: 200, tax: 20

正規表現 /\d+/(1桁以上の数字)にマッチした部分が、ブロック引数 s に渡されます。

ブロック内で s.to_i * 2 と計算することで、見つけた数字を2倍の値に変換して元の場所に埋め込んでいます。

単なる文字の置き換えだけでなく、計算や加工を伴う高度な置換処理が実現できます。

文字単位で高速に置換する tr メソッド

Rubyには gsub によく似たメソッドとして tr があります。

gsub が「文字列(パターン)」を置換するのに対し、tr「文字そのもの」 を1対1で置き換えるのが特徴です。

tr の基本的な使い方と gsub との違い

tr は、Unixコマンドの tr と同様の動作をします。

「”a”を”A”に、”b”を”B”にする」といった文字単位の変換においては、gsub よりも高速に動作します。

text = "abcdefg"

# a -> A, c -> C, e -> E にそれぞれ置換
result = text.tr("ace", "ACE")

puts result

実行結果

AbCdEfg

第1引数の文字列に含まれる文字を、第2引数の対応する位置の文字に置き換えます。

もしこれを gsub でやろうとすると、text.gsub(/[ace]/, ...) のように正規表現を書く必要がありますが、tr ならシンプルかつ高速です。

ただし、tr は正規表現を使えません。
あくまで「文字のリスト」として扱われます。

パターン記述による範囲指定

tr ではハイフンを使って文字の範囲を指定することも可能です。

text = "HELLO ruby"

# 大文字を小文字に、小文字を大文字に変換(スワップケース)
result = text.tr("A-Za-z", "a-zA-Z")

puts result

実行結果

hello RUBY

"A-Z" は「AからZまでのすべての文字」を展開した意味になります。
これを利用して、大文字と小文字を完全に入れ替える処理などが1行で書けます。

複数の文字列をまとめて一括置換するテクニック

「”赤”は”Red”に、”青”は”Blue”にしたい」というように、複数の異なる単語を一度に置換したい場合、gsub を何度も書くのは非効率です。

ハッシュ(連想配列)と正規表現を組み合わせることで、これらを一括で処理できます。

ハッシュを渡して置換する

gsub の第2引数にハッシュを渡すと、マッチした文字列をキーとしてハッシュを検索し、その値に置換してくれます。

text = "信号は赤と青と黄色です"

# 置換リスト(辞書)を作成
replace_dict = {
  "赤" => "Red",
  "青" => "Blue",
  "黄色" => "Yellow"
}

# 辞書のキーを正規表現の「または(OR)」で結合する
# /赤|青|黄色/ という正規表現が作られる
pattern = Regexp.union(replace_dict.keys)

# マッチしたキーに対応する値に置換される
result = text.gsub(pattern, replace_dict)

puts result

実行結果

信号はRedとBlueとYellowです

Regexp.union(replace_dict.keys) を使うと、ハッシュのキーを元に /赤|青|黄色/ という正規表現オブジェクトを自動生成できます。

これを gsub の第1引数にし、第2引数にハッシュそのものを渡すことで、マッチした単語(キー)に対応する値(Value)へと自動的に置き換わります。

翻訳処理や、特定の用語統一などで非常に役立つテクニックです。

元の文字列を変更する「破壊的メソッド」に注意

ここまで紹介した sub, gsub, tr は、いずれも「置換した新しい文字列」を返すメソッドであり、元の変数の中身は変更しません(非破壊的)。

しかし、それぞれのメソッドには末尾に ! が付いた 破壊的メソッド も存在します。

sub! と gsub! の挙動とリスク

text = "ruby"

# 非破壊的(textは変わらない)
text.upcase
puts text # => "ruby"

# 破壊的(text自体が書き換わる)
text.sub!("r", "R")
puts text # => "Ruby"

sub!gsub!tr! を使うと、レシーバ(元の変数)自体が書き換わります。
メモリ効率を気にする場合などに使われますが、置換が発生しなかった場合は nil を返す という点に注意が必要です。

text = "hello"

# 置換する文字がない場合
result = text.gsub!("world", "WORLD")

p result # => nil

メソッドチェーン(.gsub!(...).strip など)で繋げて書いていると、置換対象がなかった時に nil に対して次のメソッドを呼び出すことになり、エラーが発生する原因になります。

基本的には、安全な非破壊的メソッド(! なし)を使うことをおすすめします。

Rubyのスキルを活かして年収を上げる方法

以上、Rubyで文字列を置換するsub・gsub・trの使い方について解説してきました。

なお、Rubyのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

Rubyエンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなRubyの案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
エンジニアのキャリア・スキルアップ相談窓口
当ブログの読者に選ばれている、実績豊富な転職エージェントを厳選しました。
【転職】年収・環境を改善したい
年収アップにこだわりたい方 (平均アップ額138万円の実績)
未経験・経験者問わず幅広く探したい方
業界に精通した担当者に相談したい方
ゲーム業界への転職を志望する方
エンジニア未経験からキャリアを築く方
【独立】フリーランスとして稼ぎたい
国内最大級のフリーランス案件数から比較したい方
週1〜3日など柔軟な働き方を希望する方
【学習】スキルに不安のある方向け(格安スクール「デイトラ」)