Rubyで文字列を操作する方法

導入

A string is a sequence of one or more characters that may consist of letters, numbers, or symbols.

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メソッドは、文字列をそのまま表示します。

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

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

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

  1. ruby print.rb

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

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

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

3つの文字列を個別の行に表示したい場合は、putsメソッドを代わりに使用します。プログラムをprintの代わりにputsを使用するように変更してください:

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

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

Output
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

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

string_variables.rb
my_name = "Sammy the Shark"
my_age = "none of your business"

puts my_name
puts my_age

このプログラムでは、my_namemy_ageの2つの変数を定義します。各変数には文字列が割り当てられます。次に、putsメソッドを使用して各文字列を個別の行に出力します。

CTRL + Xyでファイルを保存し、次にプログラムを実行します:

  1. ruby string_variables.rb

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

Output
Sammy the Shark none of your business

文字列を変数に割り当てることで、使用するたびに同じ文字列を繰り返し入力する必要がなくなり、プログラム内で文字列を扱うことが容易になります。

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

文字列の連結

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

以下に、文字列sammysharkを連結する方法を示します。

"sammy" + "shark"

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

Output
sammyshark

連結は、文字列を末尾から連結し、それらを結合して新しい文字列値を出力します。もしsammysharkの間にスペースを入れたい場合は、以下のように片方の文字列にスペースを含める必要があります。

"sammy " + "shark"

これはプログラム内で実際にこのようなコードを書くことはありませんが、文字列と変数を頻繁に組み合わせる必要がある場合には、連結が役立ちます。

以下に例を示します。

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

これにより、My favorite color is blueという出力が得られます。出力には、文字列と変数の値の間にスペースがあるように、文字列のisの後にスペースを入れました。

このように複数の文字列を連結することもできます。ファイルconcatenation.rbを作成し、以下のコードを追加します。

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_namemy_ageという2つの変数を定義し、それぞれに文字列を割り当てています。これまでと同様に値を印刷するのではなく、連結を使用してこれらの値をより詳細なコンテキストで印刷しています。

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

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

この小さなプログラムでは、変数をこの文字列に挿入するために連結を使用しました。

複数の文字列を連結すると、プログラム全体で使用できる新しい文字列が作成されますので、作成した文字列を新しい変数に割り当てて、後で使用することができます:

concatenation.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

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

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

何が起こるかを確認するために、strings_and_integers.rbという名前の新しいプログラムを作成し、以下の内容を追加してください:

strings_and_integers.rb
my_name = "Sammy the Shark"
my_number = 27

print my_name + my_number

今回は、my_nameには文字列Sammy the Sharkが、my_numberには整数27が格納されています。引用符で囲まれていないため、27は文字列ではないことがわかります。また、小数点もないため、整数であることがわかります。

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

  1. ruby strings_and_ints.rb

以下のエラーメッセージが表示されます。

Output
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>'

以前のバージョンのRubyでは、整数にはデータ型Fixnumが割り当てられていました。これはFixed Numberの略です。Ruby 2.4では、Fixnumおよびその対応するBignumは存在しなくなり、代わりにIntegerが使用されます。

プログラムを変更し、数値27を引用符("27")で囲むことで、整数ではなく文字列として宣言することができます。または、文字列を作成する際に数値を文字列に変換することもできます。例:

strings_and_integers.rb
my_name = "Sammy the Shark"
my_number = 27

print my_name + my_number.to_s

メソッド.to_sは整数を文字列に変換します。これは、数値をプログラム内で整数として保持できるため、より良いアプローチです。出力するときにのみ文字列である必要がありますが、プログラムの他の部分で使用する場合には整数である必要があるかもしれません。

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

数値を文字列に変換して連結することは、郵便番号、通貨、電話番号など、テキストと一緒に画面に表示したい数値データを扱う際に頻繁に遭遇することです。

連結は強力ですが、トリッキーな場合があります。誤って+演算子を省略すると、構文エラーが発生する可能性があります。また、数値を保持する変数と文字列を結合する場合は、変数を文字列に変換する必要があります。Rubyにはこれらの問題に対処する別の方法である文字列補間が用意されています。

文字列補間の使用

文字列と変数を連結する場合、出力は読みにくくなり、デバッグが難しくなります。文字列補間は、ダブルクォートで囲まれた文字列内に式を埋め込むことで、この問題を解決します。

次のように書く代わりに:

"My name is " + my_name + "!"

次のようにすることができます:

"My name is #{my_name}!"

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

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

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

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

文字列補間にはもう1つの利点があります。数値を自動的に文字列に変換することができます。以前作成したstrings_and_integers.rbプログラムを再度エディタで開き、最後の行を以下のように変更してください。

strings_and_integers.rb
my_name = "Sammy the Shark"
my_number = 27

#連結ではなく補間を使用してください
print "My name is #{my_name} and my favorite number is #{my_number}."

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

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

文字列の補間は強力で便利です。変数と文字列を連結する場合には、これが推奨される方法です。

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

作成したすべての文字列は、コード内で引用符で囲まれていますが、実際の出力には引用符が含まれていません。

これらを指す際には、区別があります。 文字列リテラルは、ソースコードに書かれた文字列で、引用符を含みます。 文字列の値は、出力に表示されるもので、引用符は含まれません。

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

"Sammy the Shark"

文字列の値はSammy the Sharkです。

ほとんどの場合、この違いを気にする必要はありません。ただし、文字列内で引用符やアポストロフィなどの特殊文字を使用したい場合は、注意が必要です。

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

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

次のように、シングルクォートで囲まれた文字列の中にアポストロフィを使用しようとすると、

'This isn't what I wanted.'

「isn’t」のアポストロフィが文字列を終了させ、この例の奇妙なハイライトからわかるように、残りの文字列をコードとして解釈しようとしてエラーが発生します。

同様の状況になるのは、ダブルクォートで囲まれた文字列内で二重引用符を使用した場合です:

"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!""の新しい文字列が開始されます。しかし、この新しい文字列には終了するシングルクォートがありません。また、文字列を囲むためにシングルクォートを使用すると、似たような問題が発生します:

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

この場合、I'mのアポストロフィが文字列を終了させます。

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

オプション2:文字列内のエスケープ文字

バックスラッシュ文字(\)、通常は文字列内でのエスケープ文字として言及されるものは、Rubyが文字列内の次の文字をそのまま解釈することを防ぎます。

以下は、ダブルクオートでエンコードされた問題のある文字列です。その中にはダブルクオートが含まれています:

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

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

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

プログラムを実行してください:

  1. ruby quoting.rb

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

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

エラーを修正するには、内部のダブルクオートの前にバックスラッシュを使用してください:

quoting.rb
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

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

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)文字は必要ありません。このアプローチでは、インデントや改行を含む空白が保持されます。

その結果、出力には改行と先行するインデントが含まれるようになります。次のような形です:

Output
This is a longer string with newlines

これを防ぐために、コードから余分な空白を削除します:

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

また、heredocまたは「ヒアドキュメント」と呼ばれる用語は、プログラム内の複数行文字列リテラルを表します。次のようにコードを記述することができます:

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

<<-ENDENDマーカーは、ヒアドキュメントの開始と終了を示しています。

RubyのHeredocsは、インデントしたコードも保持するため、Heredocs内のコードをインデントすると、先頭のインデントも保持されます。つまり、このコード:

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

は、2つのスペースのインデントで出力されます。

Ruby 2.3以降では、”スクイグリー・ヒアドック”構文が提供されており、この先頭の空白を自動的に削除します。ヒアドック定義のハイフンをチルダに置き換えます。つまり、<<-<<~になります。

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

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

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

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

RubyのHeredocsは、文字列内挿もサポートしています。

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

文字列の複製

文字列を複数回繰り返すために、Rubyを使用する必要がある場合があります。この場合、*演算子を使用します。演算子+と同様に、*演算子は、数値と組み合わせて使用する場合には異なる用途があり、数値とともに使用すると乗算の演算子になります。1つの文字列と1つの整数を使用する場合、*文字列複製演算子となり、提供された整数を使用して、指定した回数だけ文字列を繰り返します。

Sammyを9回出力するには、次のコードを使用します。

print "Sammy" * 9

このコードは以下の出力を生成します。

Output
SammySammySammySammySammySammySammySammySammy

これを使用して、いくつかの素敵なASCIIアートを作成することができます。 banner.rbという名前のファイルを作成し、次のコードを追加します。

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

プログラムを実行する前に、どのような出力が生成されるか想像できますか?

このコードは以下の出力を生成します。

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

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

結論

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-work-with-strings-in-ruby