こんにちは、かつコーチです。
「文字列を整形したいけど、どのメソッドを使えばいいか分からない」。
Rubyを学び始めた方から、よくそんな声を聞きます。
この記事では、文字列の結合・分割・置換といった基本操作と、メソッドチェーンを使った書き方を解説します。
読み終える頃には、複数の処理を1行でスマートに書けるようになります。
基本の書き方
文字列の結合
Rubyでは+演算子や<<メソッド、式展開で文字列を結合できます。
first_name = "太郎"
last_name = "山田"
# +演算子で結合
full_name = last_name + first_name
puts full_name
# => 山田太郎
# 式展開で結合(推奨)
greeting = "こんにちは、#{full_name}さん"
puts greeting
# => こんにちは、山田太郎さん
式展開とは、#{}の中に変数や式を書くと、その結果を文字列に埋め込める機能のことです。
+演算子より読みやすく、他の言語の文字列連結を知っている方にも直感的です。
文字列の分割
splitメソッドを使うと、区切り文字を指定して文字列を配列に分割できます。
csv_line = "山田,太郎,30"
items = csv_line.split(",")
puts items.inspect
# => ["山田", "太郎", "30"]
引数を省略すると、空白文字で分割されます。
sentence = "Ruby は 楽しい"
words = sentence.split
puts words.inspect
# => ["Ruby", "は", "楽しい"]
文字列の置換
gsubメソッドは、文字列内の指定した部分をすべて置き換えます。
message = "今日は晴れです。明日も晴れです。"
result = message.gsub("晴れ", "雨")
puts result
# => 今日は雨です。明日も雨です。
最初の1件だけ置換したい場合はsubメソッドを使います。
message = "今日は晴れです。明日も晴れです。"
result = message.sub("晴れ", "雨")
puts result
# => 今日は雨です。明日も晴れです。
upcase・downcase・stripなどの整形メソッド
文字列の見た目を整えるメソッドも豊富に用意されています。
text = " Hello Ruby "
puts text.upcase
# => HELLO RUBY
puts text.downcase
# => hello ruby
puts text.strip
# => Hello Ruby
puts text.strip.length
# => 10
stripとは、文字列の前後にある余分な空白を取り除くメソッドのことです。
フォームから入力された値を扱うときなど、実務でも頻繁に使います。
メソッドチェーンの書き方
メソッドチェーンとは
メソッドチェーンとは、メソッドの呼び出し結果に対して、続けて別のメソッドを呼び出す書き方のことです。
.でメソッドをつなげていくことで、1つの式の中で複数の処理を表現できます。
raw_input = " Ruby PROGRAMMING "
# メソッドチェーンを使わない場合
step1 = raw_input.strip
step2 = step1.downcase
result = step2.gsub("ruby", "Ruby")
puts result
# => Ruby programming
上のコードを、メソッドチェーンでまとめると次のようになります。
raw_input = " Ruby PROGRAMMING "
result = raw_input.strip.downcase.gsub("ruby", "Ruby")
puts result
# => Ruby programming
途中の変数を作らずに済むため、コードがすっきりします。
メソッドチェーンを使うときの注意点
メソッドチェーンをつなげすぎると、逆に読みにくくなることがあります。
処理が3〜4個を超える場合は、意味のまとまりごとに変数へ分けることも検討してください。
# つなげすぎて読みにくい例
result = " Hello, Ruby World! ".strip.downcase.gsub(",", "").split.map(&:capitalize).join(" ")
# 意味のまとまりで分けた例
cleaned = " Hello, Ruby World! ".strip.downcase.gsub(",", "")
words = cleaned.split.map(&:capitalize)
result = words.join(" ")
「1つのチェーンで1つの意味」を意識すると、後から読む人にも伝わりやすくなります。
よくあるつまずきポイント・エラー対処
破壊的メソッドと非破壊的メソッドの違い
私が初心者の頃、upcaseを使っても元の変数が変わらず戸惑ったことがあります。
❌ Before
name = "yamada"
name.upcase
puts name
# => yamada(大文字になっていない)
upcaseは非破壊的メソッドで、元の文字列は変更せず、変換後の新しい文字列を返すだけです。
そのことを知らず、「メソッドを呼んだのに反映されない」と勘違いしてしまいました。
✅ After
name = "yamada"
name = name.upcase
puts name
# => YAMADA
または、末尾に!を付けた破壊的メソッドを使う方法もあります。
name = "yamada"
name.upcase!
puts name
# => YAMADA
破壊的メソッドとは、呼び出し元の変数の中身そのものを直接書き換えるメソッドのことです。
!が付くメソッドは元のデータを変更してしまうため、意図しない箇所に影響しないか注意が必要です。
まとめ
この記事のポイント
- 文字列の結合は式展開(
#{})を使うと読みやすい splitで分割、gsub/subで置換ができるstrip・upcase・downcaseで文字列を整形できる- メソッドチェーンで複数の処理を1行にまとめられる
upcaseなどは非破壊的メソッドなので、戻り値を変数に代入し直す必要がある
次に読むべき記事
文字列の次は、複数のデータをまとめて扱う配列を学びましょう。
「配列の基本:作成・追加・削除とeach」で、配列の基本操作を解説しています。