Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby文字列メソッド完全ガイド|実例付きで徹底解説

文字列(String)とは、文字が連なったシーケンスのことです。

Rubyでは文字列もオブジェクトなので、文字列を操作するための便利なメソッドが数多く用意されています。

この記事では、実務で役立つRubyの文字列メソッドを、コード例とともにわかりやすく解説します!

目次

  • 1. 文字列の長さを取得する方法
  • 2. 文字列が空かどうかを判定する方法
  • 3. 文字列補間(インターポレーション)とは?
  • 4. 部分文字列を取り出す方法
  • 5. 文字列に別の文字列が含まれるか調べる方法
  • 6. 文字列のパディング(埋め合わせ)方法
  • 7. 大文字小文字を無視して文字列を比較する
  • 8. 文字列のトリムと余白の削除方法
  • 9. 文字列の接頭辞・接尾辞の操作
  • 10. 文字列を文字の配列に変換する
  • 11. 配列を文字列に変換する
  • 12. 文字列を整数に変換する
  • 13. 文字列が数値かどうかを判定する
  • 14. 文字を追加(連結)する方法
  • 15. 文字列の各文字を繰り返し処理する
  • 16. 大文字・小文字への変換方法
  • 17. 複数行の文字列を作成する方法
  • 18. gsubメソッドで文字列内のテキストを置換する
  • 19. 文字列から最後の文字を削除する方法
  • 20. 文字列のエンコーディングを変更する方法
  • 21. 文字の出現回数をカウントする
  • 22. まとめ

1. 文字列の長さを取得する方法

とても簡単です。

"ruby".size
# 4

size の代わりに length を使うこともできます。どちらも同じ動作をします。

2. 文字列が空かどうかを判定する方法

空文字列とは、長さがゼロの文字列のことです。

次のように判定できます

"".size == 0
# true

さらに良いのは、empty? メソッドを使う方法です。

"".empty?
# true

なお「ブランク文字列」とは、長さゼロの文字列、または空白文字のみで構成された文字列を指します。

3. 文字列補間(インターポレーション)とは?

文字列補間を使うと、複数の文字列や変数を組み合わせられます。

name = "Jesus"

puts "Hello #{name}"

意外と知られていないのですが、#{} の中には実際にRubyのコードを書くこともできます。

puts "The total is #{1+1}"

# "the total is 2"

Rubyは補間ブロックに対して自動的に to_s メソッドを呼び出し、オブジェクトを文字列へ変換します。

4. 部分文字列を取り出す方法

部分文字列とは、文字列の一部のことです。先頭・中間・末尾など、特定の部分だけが必要なときに便利です。

Rubyで部分文字列を取得するにはどうすればいいのでしょうか?

ひとつの方法は、角括弧の中に開始インデックスと文字数をカンマ区切りで指定することです。

次のような形です

string = "abc123"

string[0,3]
# "abc"

string[3,3]
# "123"

最初の数字が開始インデックス、2番目の数字が取得したい文字数です。

また、「末尾の1文字以外をすべて取得したい」といった場合には、範囲(Range)を使うこともできます。

string = "abc123"

string[0..-2]
# "abc12"

この場合も最初のインデックスは開始位置ですが、2番目のインデックスは終了位置(その文字を含む)になります。-2 は後ろから2番目の文字、-1 は文字列の末尾を意味します。

部分文字列を削除または置き換えたい場合は、次のように書けます。

string[0..2] = ""

p string
# "123"

とても便利ですね!

5. 文字列に別の文字列が含まれるか調べる方法

ある文字列が別の文字列に含まれているかを確認する一番簡単な方法は何でしょうか?

include? メソッドです。

string = "Today is Saturday"

string.include?("Saturday")
# true

index メソッドを使うこともできます。

string = "Today is Sunday"

string.index("day")
# 2

このメソッドは部分一致で検索し、true/false を返す代わりに、見つかった文字列の開始インデックスを返します。

この例では、「Today」の中の「day」を見つけています。

もしパターン(たとえば「day」という単語を含むすべての単語)を検索したいなら、正規表現の出番です。

6. 文字列のパディング(埋め合わせ)方法

文字列をパディングするひとつの方法は、rjust メソッドに2つの引数を渡すことです。

binary_string = "1101"
binary_string.rjust(8, "0")

# "00001101"

右側をパディングしたい場合は ljust を使います。

binary_string = "1111"
binary_string.ljust(8, "0")

# "11110000"

7. 大文字小文字を無視して文字列を比較する

文字列比較は大文字小文字を区別するため、比較する2つの文字列が同じケースであることを確認する必要があります。

一般的なのは、比較の両辺を downcase または upcase で揃える方法です。

lang1 = "ruby"
lang2 = "Ruby"

lang1.upcase == lang2.upcase

大文字小文字を無視した比較を行う casecmp? メソッドもありますが、あまり使われていません。

上記の方法を使うのがおすすめです。

8. 文字列のトリムと余白の削除方法

ファイルやWebサイトからデータを読み込むと、文字列に余計な空白が含まれていることがあります。

そんなときは strip メソッドで余分な空白を取り除けます。

extra_space = "   test    "
extra_space.strip

# "test"

片側だけ(左/右)の空白を削除したい場合は、lstriprstrip メソッドを使いましょう。

9. 文字列の接頭辞・接尾辞の操作

start_with? メソッドを使うと、文字列が特定の接頭辞で始まるかどうかを確認できます。

string = "ruby programming"

string.start_with? "ruby"
# true

end_with? メソッドもあります。

string = "ruby programming"

string.end_with? "programming"
# true

さらに、Ruby 2.5では delete_prefixdelete_suffix メソッドが導入されました。これらも役立つ場面があるでしょう。

string = "bacon is expensive"

string.delete_suffix(" is expensive")

# "bacon"

10. 文字列を文字の配列に変換する

文字列を分解して配列にするのは、split メソッドで簡単に行えます。

string = "a b c d"

string.split
# ["a", "b", "c", "d"]

デフォルトでは split は半角スペースを区切り文字として使いますが、引数を渡せば別の区切り文字を指定できます。

カンマ区切りの値(CSV)を分割する例です:

csv = "a,b,c,d"

string.split(",")
# ["a", "b", "c", "d"]

ただし、CSVデータを本格的に扱うなら、標準ライブラリのCSVクラスの利用を検討しましょう。このクラスは列ヘッダーの読み込みなどもできるので、作業がぐっと楽になります。

11. 配列を文字列に変換する

文字列の配列を1つの大きな文字列に結合したい場合は、join メソッドを使います。

arr = ['a', 'b', 'c']

arr.join
# "abc"

join に引数を渡すこともできます。この引数は区切り文字になります。

arr = ['a', 'b', 'c']

arr.join("-")
# "a-b-c"

12. 文字列を整数に変換する

"49" のような文字列を整数 49 に変換したい場合は、to_i メソッドを使います。

"49".to_i

注意点として、数字を含まない文字列に使うと 0 が返ります。

"a".to_i
# 0

13. 文字列が数値かどうかを判定する

文字列が整数だけで構成されているかどうかを知りたいことはありませんか?

次のように判定できます

"123".match?(/\A-?\d+\Z/)
# true

"123bb".match?(/\A-?\d+\Z/)
# false

match? メソッドはRuby 2.4で導入されました。それ以前のバージョンでは、疑問符なしの match を使用してください。

このコードは正規表現を使っています。内容を訳すとこうなります:

「文字列の先頭(\A)から、任意のマイナス記号(-?、負の数用)があり、その後に数字が1つ以上続き(\d+)、文字列の終わり(\Z)まで他の文字がないことを確認する」

14. 文字を追加(連結)する方法

既存の文字列に文字を追加していくことで、大きな文字列を作れます。これは文字列連結とも呼ばれます。

<< メソッドを使った例です:

string = ""

string << "hello"
string << " "
string << "there"

# "hello there"

文字列連結に += は使わないでください。毎回新しい文字列オブジェクトが生成され、パフォーマンスに悪影響を与えます!

15. 文字列の各文字を繰り返し処理する

文字列の個々の文字を扱いたい場面はよくあります。

そのひとつの方法が each_char メソッドです。

"rubyguides".each_char { |ch| puts ch }

chars メソッドで文字列を文字の配列に変換し、その配列に対して each を使って反復処理することもできます。

array_of_characters = "rubyguides".chars
# ["r", "u", "b", "y", "g", "u", "i", "d", "e", "s"]

16. 大文字・小文字への変換方法

文字列をすべて大文字に変換したい場合は upcase メソッドを使います。

"abcd".upcase
# "ABCD"

小文字に変換したい場合は downcase メソッドを使います。

"ABCD".downcase
# "abcd"

17. 複数行の文字列を作成する方法

複数行の文字列を作る方法は2つあります。

ひとつはヒアドキュメント(heredoc)を使う方法です。

b = <<-STRING
aaa
bbb
ccc
STRING

もうひとつは %Q を使う方法です。

a = %Q(aaa
bbb
ccc
)

18. gsubメソッドで文字列内のテキストを置換する

文字列内のテキストを置換したいときは、gsubメソッドを使います。

「dogs」という単語を「cats」に置き換えてみましょう。

string = "We have many dogs"

string.gsub("dogs", "cats")

# "We have many cats"

文字列を削除したい場合は、第2引数に空文字列を指定します。

string = "abccc"

string.gsub("c", "")

# "ab"

ここで重要なポイント

gsub メソッドは新しい文字列を返します。元の文字列自体を変更したい場合は、gsub! メソッド(破壊的メソッド)を使いましょう。

gsubメソッドは正規表現も引数に取れるので、完全一致の単語だけでなくパターンを置換することも可能です。

string = "We have 3 cats"

string.gsub(/\d+/, "5")

# "We have 5 cats"

これは文字列内のすべての数字(\d+)を 5 に置き換えます。

ブロックを使った別の使い方もあります。

title = "the lord of the rings"

title.gsub(/\w+/) { |word| word.capitalize }
# "The Lord Of The Rings"

gsubsub の違いは何でしょうか?

subgsub とほぼ同じですが、最初にマッチした箇所しか置換しません。

gsub はすべてのマッチ箇所を置換します。

19. 文字列から最後の文字を削除する方法

ユーザーからの入力を受け取るとき(Kernel#getsメソッドを使用)、文字列の末尾に改行文字(\n)が付いてきます。これがあると、文字列を直接比較できません。

puts "What's your name?"
name = gets

# 何か入力する...

余分な改行文字(\n)を取り除くベストな方法は、chompメソッドを使うことです。

name = gets.chomp

Ruby 2.3以降、chompメソッドは省略可能な引数を受け取れるようになり、削除したい文字を指定できるようになりました。

"abcd?".chomp("?")
# "abcd"

指定した文字が存在しない場合は、元の文字列がそのまま返されます。

20. 文字列のエンコーディングを変更する方法

文字列はバイト列として保存されており、エンコーディングに基づいて私たちが見える文字に変換されます。

たとえば、ASCIIエンコーディングでは数値65は文字「A」を表します。

しかし、UTF-8のようなより複雑なエンコーディングもあり、さまざまな言語の文字(中国語など)や絵文字まで表現できます。

文字列の現在のエンコーディングを調べるには、encoding メソッドを使います。

"abc".encoding

# Encoding:UTF-8

ディスクからファイルを読み込んだり、Webサイトからデータをダウンロードしたりすると、エンコーディングの問題に遭遇することがあります。

そのような問題は、エンコーディングを強制指定することで解決できることが多いです。

次のようにします

"abc".force_encoding("UTF-8")

21. 文字の出現回数をカウントする

count メソッドを使うと、文字列の中に特定の文字が何回出現するかを数えられます。

例:

str = "aaab"

str.count("a")
# 3

str.count("b")
# 1

22. まとめ

この記事では、多くの文字列メソッドについて学びました。文字列を配列に分解する joinsplit、文字列内のテキストを置換する gsub、余分な空白を取り除く strip などです。

後で参照したくなるかもしれないので、ぜひブックマークして、Ruby仲間にもシェアしてください 🙂

最後まで読んでいただきありがとうございました!


  1. Rubyで実践する関数型プログラミング完全ガイド ― 純粋関数・イミュータブルデータ・カリー化の基本

    Rubyを書いていると、「関数型プログラミング」という言葉を目にする機会が増えてきます。しかし、実際にどんなものなのか、自分のコードに取り入れるべきなのか、疑問に感じている方も多いのではないでしょうか。 関数型プログラミングとは、具体的に何を指すのか? オブジェクト指向プログラミング(OOP)とは何が違うのか? Rubyでも関数型的な書き方を採用すべきなのか? この記事では、これらの疑問にわかりやすく答えながら、Rubyで今日から使える関数型プログラミングの考え方とテクニックを解説します。 関数型プログラミングとは? 関数型プログラミングは一時的な流行や難しい専門用語ではなく、長い歴史を持

  2. Rubyの文字列フォーマット入門:%演算子と書式指定子の使い方

    この記事では、Rubyで文字列をフォーマットする方法について詳しく解説します。 なぜ文字列のフォーマットが必要なのでしょうか?例えば、10未満の数値にも先頭にゼロを付けて表示したい場合(01、02、03など)、あるいはコンソール出力を見やすいように桁を揃えて整形したい場合などが挙げられます。 他の言語ではprintf関数を使って文字列をフォーマットできます。C言語を使ったことがある人なら馴染み深いでしょう。printfでは、書式指定子(フォーマット指定子)のリストと、変数や値のリストを定義して使用します。 Rubyでの文字列フォーマットの基本 Rubyでもsprintfメソッドが利用可能ですが