Rubyでテキストデータを処理する際、「特定の文字を別の文字に置き換えたい」「余分な空白を削除したい」といった文字列の置換(サブスティテュート)は、最も頻繁に行われる操作の一つです。
しかし、Rubyには sub、gsub、tr といった似たようなメソッドが複数存在するため、「どれを使えばいいのかわからない」「意図した通りに置換できない」と迷ってしまうことも少なくありません。
この記事では、Rubyにおける文字列置換の基本メソッドの使い分けから、正規表現を使った高度な置換、さらには複数の文字を一括で変換する応用テクニックまで、現場で役立つ知識をサンプルコード付きで徹底解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
基本の置換メソッド sub と gsub の違い
Rubyで文字列の置換を行う場合、まずは sub と gsub の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” に置き換わりました。
文章内の表記揺れを統一したり、特定のワードをすべて伏せ字にしたりする場合に適しています。
正規表現を使って複雑なパターンを置換する
sub や gsub の第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引数に空文字 "" を指定することで、マッチした文字を「削除」することができます。
データのクレンジング(整形)において非常に強力なテクニックです。
ブロックを使って動的な置換を行う
sub や gsub は、第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エンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



