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

提供:Dev Guides
移動先:案内検索

序章

文字列は、文字、数字、または記号で構成される1つ以上の文字のシーケンスです。

Ruby 文字列はオブジェクトであり、他の言語とは異なり、文字列は可変です。つまり、新しい文字列を作成する代わりに、その場で変更できます。

作成するほとんどすべてのプログラムで文字列を使用します。 文字列を使用すると、テキストを使用して表示し、ユーザーと通信できます。 実際、現在読んでいるページは、Webブラウザを介して画面に表示される文字列で構成されています。 文字列は、プログラミングの最も重要な基礎の1つです。

このチュートリアルでは、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.'

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

ruby print.rb

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

OutputThis 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.'

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

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

putsメソッドは、指定した文字列を出力しますが、文字列の最後に改行文字を追加します。

文字列を変数に格納する

Variables は、コンピューターのメモリ内の場所への名前付き参照です。 変数を使用してデータを保存し、後で取得します。

文字列を変数に格納するには、変数名を定義し、文字列の値を割り当てます。

my_string = 'This is my string'

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

print my_string

これを自分でテストするには、エディターでファイルstring_variables.rbを作成し、次のコードを追加します。

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メソッドを使用して、各文字列をそれぞれの行に出力します。

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

ruby string_variables.rb

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

OutputSammy the Shark
none of your business

文字列を変数に割り当てることで、使用するたびに同じ文字列を何度も入力する必要がなくなり、プログラムでの文字列の操作や操作が簡単になります。

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

文字列の連結

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

文字列sammysharkを連結する方法は次のとおりです。

"sammy" + "shark"

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

Outputsammyshark

連結は文字列を端から端まで結合し、それらを結合して新しい文字列値を出力します。 sammysharkの間にスペースを入れたい場合は、次のように、そのスペースを文字列の1つに含める必要があります。

"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_stringの2つの変数を定義します。これらの変数には、前と同じように、それぞれ独自の文字列が割り当てられています。 ただし、今回は、値を出力する代わりに、連結を使用してこれらの値をより多くのコンテキストで出力する文字列を出力します。

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

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

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

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

concatenation.rb

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変数を使用する必要はおそらくありません。 ただし、大規模なプログラムでは、複数の場所で使用する連結を使用して文字列を作成することをお勧めします。 連結や算術などのデータ処理を出力から分離することも良い習慣です。最終的にはプログラムが大きくなり、ロジックと出力を別々のファイルまたはコンポーネントに分離して、管理しやすくする必要があるためです。

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

何が起こるかを確認するには、次の内容でstrings_and_integers.rbという新しいプログラムを作成します。

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

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

Outputstrings_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")で囲んで、整数ではなく文字列として宣言することができます。 または、次のように、文字列を作成するときに数値を文字列に変換できます。

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という新しいプログラムを作成し、次のコードを追加します。

補間.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プログラムを覚えていますか? そのファイルをエディターで再度開きますが、最後の行を次のように変更します。

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を自動的に文字列に変換し、実行するとプログラムは次の出力を出力します。

OutputMy 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のアポストロフィは文字列を終了します。 その結果、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!""で新しい文字列を開始します。 ただし、この新しい文字列には、それを終了するための一致する一重引用符がありません。 また、一重引用符を使用して文字列を囲むと、同様の問題が発生します。

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

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

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

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

バックスラッシュ文字(\)は、文字列ではエスケープ文字と呼ばれることが多く、Rubyが文字列内の次の文字を文字どおりに解釈できないようにします。

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

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

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

quoting.rb

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

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

ruby quoting.rb

そして、次の出力が表示されます。

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

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

OutputThis 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)文字は必要ないことに注意してください。 このアプローチでは、インデントや改行などの空白が保持されます。

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

OutputThis 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のヒアドキュメントも空白文字を保持します。つまり、ヒアドキュメントのコードをインデントすると、先頭のインデントも保持されます。 したがって、このコード:

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

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

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

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

Rubyのヒアドキュメントは文字列補間もサポートしています。

ご覧のとおり、Rubyで改行と複数行の文字列を処理する方法はたくさんあります。 各プロジェクトには独自のスタイルがある傾向があるため、既存のRubyコードを操作するときに、これらすべてのメソッドに遭遇します。 独自のコードで、自分に合ったスタイルを選択し、一貫性を保ちます。

文字列の複製

Rubyを使用して文字列を数回繰り返す必要がある場合があります。 *演算子を使用してこれを行うことができます。 +演算子と同様に、*演算子は、数値で使用する場合の使用法が異なり、乗算の演算子です。 1つの文字列と1つの整数で使用する場合、*文字列複製演算子であり、指定した整数を使用する回数だけ1つの文字列を繰り返します。

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

print "Sammy" * 9

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

OutputSammySammySammySammySammySammySammySammySammy

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

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

プログラムを実行する前に、プログラムが何を生成するか想像できますか?

次の出力が生成されます。

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

これは、コンピューターに反復的なタスクを実行させる方法のほんの一例です。

結論

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