ウェブサイト検索

Rubyで文字列を扱う方法


紹介

文字列は、文字、数字、または記号からなる1つ以上の文字の配列です。

Rubyにおける文字列はオブジェクトであり、他の言語とは異なり、文字列はミュータブルであるため、別の文字列を作成するのではなく、その場で変更することができます。

ほとんどすべてのプログラムで文字列を使用します。文字列を使用すると、テキストを使ってユーザーと表示およびコミュニケーションを取ることができます。実際、あなたが今読んでいるページは、Webブラウザを通じて画面に表示された文字列で構成されています。文字列はプログラミングの最も重要な基本の1つです。

このチュートリアルでは、Rubyで文字列を扱う方法を学びます。文字列を作成し、画面に表示し、変数に格納し、複数の文字列を結合し、改行、アポストロフィ、ダブルクオートなどの特殊文字を扱う方法を学びます。

文字列の作成と印刷

Rubyでは、文字列はシングルクオーテーション<code>'</code>またはダブルクオーテーション<code>"</code>で囲まれていますので、文字列を作成するには、一連の文字をどちらかで囲みます:

'This is a string in single quotes.'

"This is a string in double quotes."

シングルクォートまたはダブルクォートのどちらかを使用することを選択できます。ほとんどの場合、どちらを選んでも問題ありませんが、一貫性がある限りです。ただし、ダブルクォートを使用すると、文字列補間を行うことができ、これはこのチュートリアルで学ぶことになります。

プログラムで文字列を表示するには、print メソッドを使用できます:

print "Let's print out this string."

printメソッドは、書かれた通りに文字列を表示します。

試してみてください。テキストエディタを使って print.rb という新しいRubyプログラムを作成し、print メソッドを使って3つの文字列を印刷します:

print 'This is the first string.'
print 'This is the second string.'
print 'This is the third string.'

ファイルを保存してプログラムを実行します:

  1. ruby print.rb

次の出力が表示されます:

This is the first string.This is the second string.This is the third string.

独自の行に印刷された3つの文字列の代わりに、3つの文字列が1行にまとめて印刷されました。print メソッドは文字列を画面に印刷しますが、各文字列を独自の行にしたい場合は、自分で改行文字を追加する必要があります。

3つの文字列を別々の行に表示したい場合は、putsメソッドを使用してください。プログラムを修正して、printの代わりにputsを使用してください:

puts 'This is the first string.'
puts 'This is the second string.'
puts 'This is the third string.'

今、プログラムをもう一度実行してみてください。そうすれば、この出力が表示されます:

This is the first string.
This is the second string.
This is the third string.

puts メソッドは、指定した文字列を印刷しますが、文字列の末尾に改行文字を自動的に追加します。

変数に文字列を格納する

変数はコンピュータのメモリ上の場所への名前付き参照です。データを保存するために変数を使用し、後でそれを取り出します。

文字列を変数に格納するには、変数名を定義し、その文字列の値を代入します:

my_string = 'This is my string'

次に、値を取得するには、変数の名前を使用します:

print my_string

これを自分で試すには、エディタで次のコマンドを使って string_variables.rb というファイルを作成してください:

  1. nano string_variables.rb

次に、以下のコードを追加します:

my_name = "Sammy the Shark"
my_age = "none of your business"

puts my_name
puts my_age

このプログラムは、my_nameとmy_ageの2つの変数を定義します。それぞれの変数には文字列が割り当てられています。次に、putsメソッドを使用して、各文字列を独自の行に印刷します。

CTRL + X と y を押してファイルを保存し、その後プログラムを実行します:

  1. ruby string_variables.rb

次の出力が表示されます:

Sammy the Shark
none of your business

変数に文字列を割り当てることで、使用したいときに同じ文字列を何度も打ち込む必要がなくなり、プログラム内で文字列を扱いやすく、操作しやすくなります。

文字列を結合して新しい文字列を作成する方法を見てみましょう。

文字列の連結

連結とは、2つ以上の文字列を結合して新しい文字列を作成することを意味します。連結を行うためには、連結演算子を使用し、これは+記号で表されます。+記号は、算術演算の際には加算演算子でもあります。

ここでは、sammy と shark の文字列をどのように連結するかを示します:

"sammy" + "shark"

これにより、次の出力が生成されます。

sammyshark

連結は文字列を端から端まで結合し、新しい文字列の値を出力します。単語「sammy」と「shark」の間にスペースを入れたい場合は、そのスペースを文字列のいずれかに含める必要があります。例えば、次のようにします:

"sammy " + "shark"

さて、プログラムでこのようなコードを書くことは実際にはありませんが、文字列と変数を一緒に混ぜる必要がかなり頻繁にあります。そのため、連結が重要になります。

こちらが一例です:

color = "Blue"
print "My favorite color is " + color

これは出力が私の好きな色は青ですになることを意味します。出力の文字列と変数の値の間にスペースができるように、文字列の中のisの後にスペースを残したことに注意してください。

この方法で複数の文字列を連結できます。ファイルconcatenation.rbを作成し、このコードを追加してください:

my_name = "Sammy the Shark"
my_age = "none of your business"

puts "My name is " + my_name + " and my age is " + my_age + "."

このプログラムは、my_name と my_age の2つの変数を定義しており、それぞれに独自の文字列が割り当てられています。これは、あなたが以前に行ったことと同様です。しかし、今回は値を印刷するのではなく、連結を使用してそれらの値に追加のコンテキストを持たせた文字列を印刷しています。

このプログラムを実行すると、次の出力が表示されます:

My name is Sammy the Shark and my age is none of your business.

この小さなプログラムでは、結合を使って変数をこの文字列に挿入しました。

2つ以上の文字列を連結して結合すると、新しい文字列が作成され、その文字列をプログラム全体で使用できますので、作成した文字列を後で使用できるように新しい変数に割り当てることをお勧めします。

my_name = "Sammy the Shark"
my_age = "none of your business"

assign concatenated string to variable
output = "My name is " + my_name + " and my age is " + my_age + "."

Print the output.
puts output

このような小さなプログラムでは、追加のoutput変数を使用することは多分必要ありません。しかし、より大きなプログラムでは、複数の場所で使用するために連結を使って文字列を作成したいと思うかもしれません。また、最終的にはプログラムが大きくなり、ロジックと出力を別のファイルやコンポーネントに分けて管理しやすくするために、連結や算術演算のようなデータ処理を出力から分離するのは良い習慣です。

異なるデータ型の間で+演算子を使用しないようにしてください。たとえば、文字列と整数を連結することはできません。

何が起こるかを見るために、次の内容でstrings_and_integers.rbという新しいプログラムを作成してください:

my_name = "Sammy the Shark"
my_number = 27

print my_name + my_number

今回は、文字列「サミー・ザ・シャーク」を保持するmy_nameと、整数「27」を保持するmy_numberがあります。「27」は引用符で囲まれていないので、文字列ではないことがわかります。また、小数点もないので、整数であることもわかります。

プログラムを実行すると:

  1. ruby strings_and_ints.rb

このエラーメッセージが表示されます:

strings_and_ints.rb:4:in `+': no implicit conversion of Integer into String (TypeError)
from strings_and_ints.rb:4:in `<main>'

エラー no implicit conversion of Integer into String は、Rubyが既存の文字列に対して文字列だけを連結できることを意味します。

Rubyバージョン2.3以下では、代わりにこのエラーメッセージが表示されます:

strings_and_ints.rb:4:in `+': no implicit conversion of Fixnum into String (TypeError)
from strings_and_ints.rb:4:in `<main>'

キーワードFixnumは、以前のRubyバージョンで整数に与えられたデータ型です。固定数を意味する短縮形です。Ruby 2.4では、Fixnumとその対になるBignumはもはや存在せず、その代わりにIntegerに置き換えられました。

私たちはプログラムを変更して、数字27を引用符("27")で囲むことができます。そうすれば、それは整数ではなく文字列として宣言されます。または、文字列を作成する際に数字を文字列に変換することもできます。次のように:

my_name = "Sammy the Shark"
my_number = 27

print my_name + my_number.to_s

.to_sメソッドは整数を文字列に変換します。これはより良いアプローチであり、プログラム内で数値を整数のまま保持することができます。出力する際に文字列である必要があるだけですが、プログラムの他の部分の処理で使用する必要がある場合は整数であった方が良いでしょう。

プログラムを再実行すると、画面にSammy the Shark27が表示されるのが見えます。

数字を文字列に変換して結合することは、郵便番号、通貨、電話番号、および画面上にテキストと一緒に表示したいその他の数値データを扱う際によく遭遇することです。

連結は強力ですが、扱いが難しい場合があります。もし+演算子の1つをうっかり省略してしまうと、構文エラーが発生します。また、変数に数値が含まれている場合に文字列を結合する必要がある場合は、変数を文字列に変換しなければなりません。Rubyは、これら2つの問題に対処するため、文字列補間と呼ばれる、変数の値を文字列に注入する別の方法を提供しています。

文字列補間を使用する

文字列と変数を連結する際、出力が読みづらく、デバッグが難しいことがあります。文字列補間は、ダブルクオートで囲まれた文字列内に式を埋め込むことを可能にすることで、これを解決します。

これを書く代わりに:

"My name is " + my_name + "!"

あなたはこれができます:

"My name is #{my_name}!"

文字列を終了させて+演算子を使用する代わりに、変数を#{}構文で囲みます。この構文はRubyに式を評価させて文字列に埋め込むよう指示します。

試してみてください。interpolation.rbという新しいプログラムを作成し、このコードを追加します:

my_name = "Sammy the Shark"
my_age = "none of your business"

output = "My name is #{my_name} and my age is #{my_age}."

puts output

これはあなたがすでに書いたのと同じプログラムですが、今回は文字列補間を使用して出力を生成します。

文字列補間にはもう一つの利点があります。それは、数値を自動的に文字列に変換できることです。あなたのstrings_and_integers.rbプログラムを思い出してください。そのファイルを再びエディタで開いて、最後の行を次のように変更してください:

my_name = "Sammy the Shark"
my_number = 27

use interpolation instead of concatenation
print "My name is #{my_name} and my favorite number is #{my_number}."

Rubyは自動的にmy_numberを文字列に変換し、プログラムを実行すると次の出力が表示されます:

My name is Sammy the Shark and my favorite number is 27.

文字列補間は強力で便利です。また、変数との文字列連結に推奨される方法でもあります。

文字列リテラルと文字列値

作成したすべての文字列がコード内で引用符で囲まれていることに注意してください。ただし、実際に印刷された出力には引用符は含まれていません。

これらを言及する際には区別があります。文字列リテラルは、ソースコードに記述されたそのままの文字列であり、引用符が含まれています。文字列値は出力で見られるもので、引用符は含まれていません。

これは文字列リテラルです:

"Sammy the Shark"

文字列の値は サミー・ザ・シャーク です。

ほとんどの場合、この違いについて心配する必要はありませんが、文字列に引用符やアポストロフィなどの特殊文字を使用したい場合は除きます。

文字列内の引用符とアポストロフィのエスケープ

文字列を示すために引用符が使用されるため、文字列内にアポストロフや引用符を含めたい場合は、少し追加作業をする必要があります。

もし単一引用符の文字列の中にアポストロフィを使おうとすると、次のようになります。

'This isn't what I wanted.'

isn'tのアポストロフィは文字列を終了させます。この例の奇妙なハイライトからもわかるように。その結果、Rubyインタープリタは意図された文字列の残りをコードとして解析しようとし、エラーが発生します。

ダブルクォートで囲まれた文字列内でダブルクォートを使用すると、同じ状況に直面することになります:

"Sammy says, "Hello!""

この例では、Hello の前の閉じ二重引用符が文字列を終了させ、Hello! の後の二重引用符が終了するための一致する二重引用符を持たない新しい文字列を作成するため、Ruby はエラーを表示します。

この問題を避けるために、いくつかの選択肢があります。まず、文字列を作成するための代替構文を使用できます。文字列内にダブルクオートを使用する必要がある場合は、シングルクオートを使用して文字列を定義し、逆も同様です。また、クオートをエスケープすることや、文字列を定義するために異なるRuby構文を使用することもできます。それぞれのアプローチを見てみましょう。

オプション1: 代替文字列構文を使用する

これらの問題を回避する最も簡単な方法は、文字列にダブルクォートを含める必要があるときはシングルクォートで囲み、文字列にシングルクォートを使用する必要があるときはダブルクォートで囲むことです。

この文字列をシングルクォートで定義する代わりに:

'This isn't what I wanted.'

それを二重引用符で定義してください。

"This isn't what I wanted."

そして、この文字列を定義するためにダブルクオートを使用する代わりに:

"Sammy says, "Hello!""

シングルクォートを使用してください:

'Sammy says, "Hello!"'

代替構文を使うことで、いくつかの緊急事態を切り抜けることができますが、常にうまくいくわけではありません。例えば、この文字列にはどちらの方法も通用しません:

"Sammy says, "I'm a happy shark!""

この例では、I'mの前の閉じ二重引用符が実際に物事を混乱させます。これは最初の文字列を終了させ、その後RubyはI'mの中のアポストロフィに遭遇し、新しい文字列を開始します。その新しい文字列はm a happy shark!""という値を持ちます。しかし、この新しい文字列には終了するための一致する単一引用符がありません。そして、文字列を enclosed するために単一引用符を使用すると、同様の問題が発生します:

'Sammy says, "I'm a happy shark!"'

今回は、I'm の中のアポストロフィが文字列を終了します。

代替構文を使用すると、コードが一貫性を欠く可能性があります。文字列構文の間を常に切り替えると混乱することがあります。この問題を回避するために、エスケープ文字を使用することができます。

オプション2: 文字列内のエスケープキャラクター

バックスラッシュ文字(\)は、一般に文字列内のエスケープ文字と呼ばれ、Rubyが文字列内の次の文字を文字通りに解釈するのを防ぎます。

ここに私たちの問題のある文字列があります。二重引用符でエンコードされ、内部に二重引用符があります。

"Sammy says, "I'm a happy shark!""

新しいRubyプログラムをquoting.rbという名前で作成し、このコードをファイルに追加します:

print "Sammy says, "I'm a happy shark!""

プログラムを実行します:

  1. ruby quoting.rb

そして、この出力が表示されます:

quoting.rb:1: syntax error, unexpected tCONSTANT, expecting end-of-input
print "Sammy says, "I'm a happy shark!""
^

エラーを修正するには、内側の二重引用符の前にバックスラッシュを使用してください。

print "Sammy says, \"I'm a happy shark!\""

プログラムを再実行すると、期待していた出力が表示されます。

Sammy says, "I'm a happy shark!"

この例ではアポストロフィをエスケープする必要がないことに注意してください。なぜなら、衝突がないからです。Rubyを混乱させる引用符だけをエスケープする必要があります。

文字列を定義する異なる構文を使用することで、引用符を完全にエスケープすることを避けることができます。

オプション3: 文字列の代替構文の使用

これまで、文字列の境界を定義するために引用符を使用してきましたが、Rubyでは他の文字を使って文字列を作成することもできます。文字列を囲むために使用したいデリミタ(区切り文字)をパーセント記号の後に指定することで定義できます。以下のように:

%$Sammy says, "I'm a happy shark!"$

この構文は、埋め込まれた文字列を自動的にエスケープします。実際の文字列は次のようになります:

"Sammy says, \"I'm a happy shark!\""

しかし、区切り文字を変更すると、その区切り文字を使用する場合はエスケープする必要があります。この場合、文字列にドル記号を使用する必要がある場合、文字列内のリテラルドル記号をエスケープする必要があります。

これを避けるために、中括弧、角括弧、または丸括弧のペアを区切りとして使用することもできます。中括弧が最も一般的です:

%{Sammy says, "I'm a happy shark!"}

これらの形式は、必要に応じて文字列補間をサポートしています。

droplets = 5
print %{Sammy says, "I just created #{droplets} droplets!"}

Rubyプログラムで文字列を定義するために、%Q{}および%q{}も使用されます。%Q{}構文はダブルクオーテーションで囲まれた文字列とまったく同じように機能するため、ダブルクオーテーションをエスケープする必要がなく、文字列補間を使用することができます。

droplets = 5
print %Q{Sammy says, "I just created #{droplets} droplets!"}

%q{}構文は、単一引用符で囲まれた文字列とまったく同様に機能します。

%q{Sammy says, "I'm a happy shark!"}

一部のプログラムでは、波括弧の代わりに括弧や角括弧とともに%qや%Qの構文が使用されることがあります。

ご覧のように、Rubyでは文字列を作成する方法がたくさんあります。どの方法を選んでも、コードの一貫性を保ちましょう。%Q{}と%{}の方法が最も一般的であることがわかるでしょう。

特別な文字の扱い方が分かったので、長い文字列と改行文字の扱い方を見てみましょう。

長い文字列と改行

文字列に改行文字やキャリッジリターンを挿入したくなることがあります。その場合、コード内に改行を挿入するために \n または \r のエスケープ文字を使用できます:

output = "This is\na string\nwith newlines"
puts output

このプログラムはこの出力を生成します:

This is
a string
with newlines

これは、出力を複数行に取得するために技術的に機能します。ただし、非常に長い文字列を1行で書くと、すぐに読みづらく、作業が難しくなります。いくつかの解決策があります。

まず、連結演算子を使って文字列を複数行に分割することができます:

output = "This is a\n" +
"longer string\n" +
"with newlines."
puts output

これは、あなたがすでに行ったことと似ていて、3つの文字列を連結するだけです。

文字列の中に改行をそのまま入れても構いません。

output = "This is a
longer string
with newlines"
puts output

代替の文字列構文を使用して、複数行の文字列を作成することもできます:

output = %{This is a
longer string
with newlines}
puts output

これらの2つの例では、改行(\n)文字が必要ないことに注意してください。このアプローチは、インデントや改行を含むホワイトスペースを保持します。

その結果、出力には改行やすべての先頭のインデントが含まれます。

This is a
longer string
with newlines

それを防ぐために、コードから余分な空白を削除してください:

output = %{This is a
longer string
with newlines
}

複数行の文字列は、ヒアドキュメント、つまり「ヒアドキュメント」と呼ばれるプログラム内の複数行文字列リテラルのための用語を使用して作成することもできます。以下はそのコードの書き方です:

output = <<-END
This is a
longer string
with newlines
END

この<<-END と END マーカーは heredoc の開始と終了を示します。

Rubyのヒアドキュメントは空白文字も保持するため、ヒアドキュメント内でコードをインデントすると、先頭のインデントも保持されます。したがって、このコード:

output = <<-END
This is a
longer string
with newlines
END

二つのスペースのインデントで出力する。

Ruby 2.3以降では、「スキグリー ヘルドク」構文が提供され、これにより先頭の空白が自動的に削除されます。ヘルドク定義のハイフンをチルダに置き換えるので、<<-は<<~のようになります。

output = <<~END
This is a
longer string
with newlines
and the code is indented
but the output is not.
END

これにより、次の出力が得られます。

This is a
longer string
with newlines
and the code is indented
but the output is not.

これにより、ヒアドキュメントを使用し、コードをきれいにインデントすることができます。

RubyのHeredocは文字列の挿入もサポートしています。

ご覧のとおり、Rubyでは改行や複数行の文字列を扱う方法がたくさんあります。既存のRubyコードを扱う際には、これらのすべての方法に出くわすでしょう。各プロジェクトにはそれぞれ独自のスタイルがあるためです。自分のコードでは、自分に合ったスタイルを選び、一貫性を持たせましょう。

文字列の複製

文字列を何度も繰り返す必要がある場合があります。その際には、* 演算子を使用できます。+ 演算子と同様に、* 演算子は数字と一緒に使用するときに異なる意味があり、掛け算の演算子です。しかし、1つの文字列と1つの整数を使用するとき、* は 文字列複製演算子 となり、提供された整数を使用して、単一の文字列を好きなだけ繰り返します。

サミーを9回出力するには、次のコードを使用します:

print "Sammy" * 9

このコードは次の出力を生成します:

SammySammySammySammySammySammySammySammySammy

これを使って素敵なASCIIアートを作成できます。banner.rbというファイルを作成し、次のコードを追加してください:

puts "=" * 15
puts "| Hello World |"
puts "=" * 15

プログラムを実行する前に、それが何を出力するか想像できますか?

これを出力します:

===============
| Hello World |
===============

これは、コンピュータに繰り返し作業を行わせる方法のほんの小さな例です。

結論

このチュートリアルでは、Rubyプログラミング言語における文字列データ型の扱い方を学びました。新しい文字列を作成し、他の文字列と連結し、改行、引用符、アポストロフィを処理しました。そして、文字列の補完を使用して文字列と変数の値を混ぜるのを簡単にし、文字列を繰り返す方法を学びました。

関連記事: