Rubyで文字列を扱う方法についての使い方
イントロダクション
文字列は、文字、数字、または記号からなる一つ以上の連続した文字の列です。
Rubyの文字列はオブジェクトであり、他の言語とは異なり、文字列は可変であり、新しい文字列を作成する代わりにその場で変更することができます。
ほぼすべてのプログラムで文字列を使用します。文字列はテキストを表示しユーザーとのコミュニケーションに役立ちます。実際、今読んでいるこのページも、あなたのウェブブラウザを通じて画面上に表示された文字列で構成されています。文字列はプログラミングの中でも最も重要な基礎の一つです。
このチュートリアルでは、Rubyで文字列を扱う方法を学びます。文字列を作成し、画面に表示し、変数に格納し、複数の文字列を結合する方法、改行、アポストロフィ、ダブルクォートなどの特殊文字を扱う方法を学びます。
文字列の作成と印刷
Rubyでは、文字列はシングルクォーテーション(’)またはダブルクォーテーション(”)で囲まれます。したがって、文字列を作成するには、文字のシーケンスをどちらかのクォーテーションで囲みます。
'This is a string in single quotes.'
"This is a string in double quotes."
シングルクォーテーションやダブルクォーテーションのどちらを使うかは選ぶことができます。ほとんどの場合、一貫性があればどちらを選んでも問題ありません。ただし、ダブルクォーテーションを使用することで、このチュートリアルで学ぶ文字列補間を行うことができます。
プログラム内に文字列を表示するためには、printメソッドを使用することができます。
print "Let's print out this string."
プリントメソッドは、文字列をそのまま表示します。
試してみて。テキストエディタを使って、print.rbという新しいRubyプログラムを作成し、printメソッドを使って3つの文字列を出力してください。
print 'This is the first string.'
print 'This is the second string.'
print 'This is the third string.'
ファイルを保存してプログラムを実行してください。
- ruby print.rb
以下の出力が表示されます。
This is the first string.This is the second string.This is the third string.
3つの文字列は1つの行にまとめて表示されましたが、本来はそれぞれの文字列を別々の行に表示したい場合は、改行文字を自分で追加する必要があります。
もし、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というファイルを以下のコマンドで作成してください。
- nano string_variables.rb
その後、次のコードを追加してください。 (Sono ato, tsugi no kōdo o tsuika shite kudasai.)
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で保存して、その後プログラムを実行してください。
- ruby string_variables.rb
以下の出力が表示されます。
Sammy the Shark none of your business
変数に文字列を割り当てることで、同じ文字列を繰り返しタイプしなくても使いたい時に利用できるようになります。これによって、プログラムで文字列をより簡単に操作したり取り扱ったりすることができます。
新しい文字列を作成するために、文字列を結合する方法を見てみましょう。
文字列の連結
連結は、新しい文字列を作成するために2つ以上の文字列を結合することを意味します。連結するためには、連結演算子である + 記号を使用します。この + 記号は、算術演算と一緒に使用される場合にも加算演算子としても機能します。
以下は、文字列”サンミー”と”シャーク”を連結する方法です。
"sammy" + "shark"
これにより、次の出力が生成されます。
sammyshark
連結は文字列を末尾同士で結合し、それらを組み合わせて全く新しい文字列の値を出力します。もし「sammy」と「shark」の間にスペースが欲しい場合は、そのスペースを片方の文字列に含める必要があります。例えば、次のようにします:
"sammy " + "shark"
今、プログラム内でこのようなコードを実際に書くことはないでしょうが、文字列と変数を頻繁に組み合わせる必要があります。その際に連結が重要な役割を果たします。
例を挙げましょう: (Rei o age mashou)
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.
この小さなプログラムでは、変数をこの文字列に組み込むために結合を使用しました。
複数の文字列を連結させることで、プログラム全体で使用することができる新しい文字列を作成するため、後で使用するために作成した文字列を新しい変数に代入することがあります。
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
このような小さなプログラムでは、追加の出力変数を使うことはおそらく不要でしょう。しかし、より大きなプログラムでは、複数の場所で使用するために連結を使って文字列を作成したい場合があります。また、連結や算術のようなデータ処理を出力から分離することは良い習慣です。将来的にはプログラムが大きくなり、ロジックと出力を別々のファイルやコンポーネントに分けて管理することが求められるからです。
異なるデータ型の間では、必ず+演算子を使用しないようにしてください。例えば、文字列と整数を連結することはできません。
何が起こるかを見るために、以下の内容を持つ新しいプログラム「strings_and_integers.rb」を作成してください。
my_name = "Sammy the Shark"
my_number = 27
print my_name + my_number
今回は、文字列「Sammy the Shark」を保持する「my_name」と整数「27」を保持する「my_number」という変数があります。引用符で囲まれていないため、27が文字列ではないことがわかります。また、小数点もないため、整数であることがわかります。
プログラムを実行すると、
- 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>’
整数を文字列に暗黙的に変換することはできませんというエラーは、Rubyでは既存の文字列にのみ文字列を連結することができることを意味しています。
Note
strings_and_ints.rb:4:in `+’: no implicit conversion of Fixnum into String (TypeError)
from strings_and_ints.rb:4:in `
キーワードであるFixnumは、以前のRubyのバージョンでは整数に与えられたデータ型でした。それはFixed Numberの略称です。Ruby2.4では、Fixnumとその対応するBignumは存在せず、それらは代わりにIntegerに置き換えられました。
私たちは、プログラムを変更し、数字27を引用符(「27」)で囲むことで、整数ではなく文字列として宣言することができます。または、文字列を作成する際に数字を文字列に変換することもできます。例えば、以下のようにすることもできます。
my_name = "Sammy the Shark"
my_number = 27
print my_name + my_number.to_s
.to_s メソッドは整数を文字列に変換します。これはより良いアプローチです。なぜなら、プログラム内では数値を整数のまま保持しておきたい場合もありますが、表示する際にのみ文字列にする必要があるからです。プログラムロジックの他の部分で使用する必要がある場合には整数のままであることが望ましいです。
もう一度プログラムを実行すれば、画面上にサメのサミー27が表示されます。
郵便番号、通貨、電話番号など、画面上でテキストと一緒に表示したい数値データを扱う際に、数値を文字列に変換して連結することは頻繁に遭遇するものです。
連結は強力ですが、難しいこともあります。+ 演算子のうちの1つを誤って省略すると、構文エラーが発生する可能性があります。また、変数に保持された数値を含む文字列を結合する必要がある場合、変数を文字列に変換する必要があります。Rubyには、これらの問題の両方に対応する文字列内挿と呼ばれる変数の値を文字列に埋め込む別の方法が用意されています。
文字列内挿を使用する
文字列と変数を連結する際、出力を読みづらくしてデバッグすることがあります。文字列内にダブルクオーテーションで囲まれた式を埋め込むことで、文字列補間はこの問題を解決します。
以下のように書かないでください:
"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.
文字列内挿(string interpolation)は、強力で便利な手法です。変数を含めた文字列の連結においても、一般的に最適な方法です。
文字列リテラルと文字列の値
作成したすべての文字列が、コード内では引用符で囲まれていることに注意してくださいが、実際の出力結果には引用符が含まれていません。
これらを指す際には、区別があります。文字列リテラルは、ソースコードに書かれているままの文字列で、引用符を含みます。文字列の値は、出力で見るものであり、引用符は含みません。
これは文字列リテラルです。
"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!""
シングルクォーテーションを使用してください。 (Shinguru kuōtēshon o shiyō shite kudasai.)
'Sammy says, "Hello!"'
違った構文を使用することで、一部の短期的なトラブルから抜け出すことができますが、常にうまくいくわけではありません。例えば、この文字列に対してはどちらのアプローチも機能しません。
"Sammy says, "I'm a happy shark!""
この例では、”I’m really” の前の閉じの二重引用符が混乱を引き起こします。これにより、最初の文字列が終了し、その後、Rubyは「m a happy shark!」という値で新しい文字列を検出しますが、この新しい文字列には対応するシングルクォートがありません。また、シングルクォートを使用して文字列を囲むことで、似たような問題が発生します。
'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!""
プログラムを実行する。
- 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!"
この例では、コンフリクトがないため、アポストロフィーをエスケープする必要はないことに気づいてください。ルビーが混乱すると思われる引用符をエスケープする必要があります。
引用符を使用している代わりに、異なる構文を使って文字列を定義することで、完全に引用符を回避することができます。
オプション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
これらの例のいずれにおいても、改行文字(\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」のマーカーは、ヒアドキュメントの開始と終了を示しています。
RubyのHeredocsは、空白文字も保持されるため、Heredoc内のコードをインデントすると、先頭のインデントも保持されます。したがって、次のコード:
output = <<-END
This is a
longer string
with newlines
END
インデントを2つのスペースで印刷されるようにします。
Ruby 2.3以上では、”squigglyヒアドキュメント”構文が提供されており、この先頭の空白を自動的に削除します。ヒアドキュメントの定義内のハイフンをチルダで置き換えてください。したがって、<<-が<<~となります。
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のHeredocsでは、文字列内挿もサポートされています。
新しい行と複数行の文字列を扱うためには、Rubyにはさまざまな方法があります。既存のRubyコードを使用する際には、これらの方法すべてに遭遇することになるでしょう。なぜなら、各プロジェクトにはそれぞれ独自のスタイルがありますから。自分自身のコードでは、自分に合ったスタイルを選び、一貫性を持ってください。
文字列の複製
Rubyを使用して文字列を繰り返す必要がある場合があります。それは*演算子を使用することで実現できます。+演算子と同様に、*演算子は数字と組み合わせると異なる使い方をします。ただし、*演算子は文字列と整数を組み合わせた場合、文字列の複製演算子となり、提供された整数を使用して文字列を指定回数繰り返すことができます。
「Sammy」を9回印刷するには、以下のコードを使用します。
print "Sammy" * 9
このコードは、次の出力を生成します。
SammySammySammySammySammySammySammySammySammy
ASCIIアートを作成するためにこれを使うことができます。banner.rbというファイルを作成し、以下のコードを追加してください。
puts "=" * 15
puts "| Hello World |"
puts "=" * 15
プログラムを実行する前に、そのプログラムが何を生成するか想像できますか?
この出力を生成します。
=============== | Hello World | ===============
これは、コンピューターに繰り返しのタスクを自動実行させる方法の小さな例です。
結論
このチュートリアルでは、Rubyプログラミング言語で文字列データ型を操作する方法を学びました。新しい文字列を作成し、他の文字列と連結させ、改行、引用符、アポストロフィに対応しました。また、文字列内挿を使用して文字列と変数の値を組み合わせる方法も習得し、文字列の繰り返し方法も学びました。