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

前書き

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

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

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

このチュートリアルでは、Rubyで文字列を操作する方法を学びます。 文字列を作成し、画面に表示し、変数に保存し、複数の文字列を結合し、改行、アポストロフィ、二重引用符などの特殊文字の処理方法を学習します。

文字列の作成と印刷

文字列は、Rubyの単一引用符 `+ '`または二重引用符 `" + `内に存在するため、文字列を作成するには、文字のシーケンスをいずれかで囲みます。

'This is a string in single quotes.'

"This is a string in double quotes."

単一引用符または二重引用符を使用することを選択できます。 ほとんどの場合、一貫している限り、どちらを選択してもかまいません。 ただし、二重引用符を使用すると、_string補間_を実行できます。これについては、このチュートリアルで学習します。

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

print "Let's print out this string."

`+ print +`メソッドは、記述されたとおりに文字列を表示します。

やってみよう。 https://www.digitalocean.com/community/tutorials/how-to-write-your-first-ruby-program [新しいRubyプログラムを作成]テキストエディターを使用して「+ print.rb 」と呼ばれ、「 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

'This is the first string.'
'This is the second string.'
'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

このプログラムは、2つの変数、 `+ my_name `およびmy_ageを定義します。 各変数には文字列が割り当てられます。 次に、 ` puts +`メソッドを使用して、各文字列を独自の行に出力します。

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

ruby string_variables.rb

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

OutputSammy the Shark
none of your business

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

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

文字列連結

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

文字列 `+ sammy `と ` shark +`を連結する方法は次のとおりです。

"sammy" + "shark"

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

Outputsammyshark

連結は、文字列をエンドツーエンドで結合し、それらを結合して、まったく新しい文字列値を出力します。 単語 `+ sammy `と ` shark +`の間にスペースを置きたい場合は、次のように、文字列の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 + "."

このプログラムは、2つの変数を定義します。「+ my_name 」と「 my_string +」で、それぞれ以前に行ったように、それぞれに割り当てられた文字列があります。 ただし、今回は、値を出力する代わりに、連結を使用してそれらの値をもう少しコンテキストで出力する文字列を出力しています。

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

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 IntegerのString +への暗黙的な変換」は、Rubyが文字列を既存の文字列にのみ連結できることを意味します。

プログラムを変更し、数値の代わりに引用符( " 27 ")を使用して、整数ではなく文字列として宣言することができます。 または、次のように、文字列を作成するときに数値を文字列に変換できます。

strings_and_integers.rb

my_name = "Sammy the Shark"
my_number = 27

print my_name + my_number

`+ .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

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

文字列補間には別の利点があります。数値を文字列に自動的に変換できます。 `+ 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.

文字列補間は強力で便利です。 また、変数と文字列を連結するための好ましい方法です。

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

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

これらのそれぞれを参照する際には区別があります。 _string literal_は、引用符を含むソースコードに記述されている文字列です。 _string value_は出力に表示されるものであり、引用符は含まれません。

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

"Sammy the Shark"

文字列値は「+ Sammy the Shark」になります。

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

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

文字列を示すために引用符が使用されるという事実により、文字列にアポストロフィと引用符が必要な場合は、少し余分な作業を行う必要があります。

次のように、単一引用符で囲まれた文字列の途中でアポストロフィを使用しようとした場合:

'This isn't what I wanted.'

この例の奇妙な強調表示からわかるように、 `+ is n’t +`のアポストロフィは文字列を終了します。 その結果、Rubyインタープリターは目的の文字列の残りをコードとして解析しようとするため、エラーが発生します。

二重引用符で囲まれた文字列で二重引用符を使用すると、同じ状況に陥ります。

"Sammy says, "Hello!""

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

この問題を回避するには、いくつかのオプションがあります。 まず、文字列を作成するための代替構文を使用できます。文字列で二重引用符を使用する必要がある場合は、単一引用符を使用して文字列を定義します。逆も同様です。 引用符を_エスケープ_するか、別の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:文字列内の文字のエスケープ

バックスラッシュ文字( + \ +)は、文字列で_escape character_と呼ばれることが多く、文字列内の次の文字を文字通り解釈することを防ぎます。

二重引用符でエンコードされ、内部に二重引用符があるエンコードされた問題のある文字列は次のとおりです。

"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で文字列を作成することもできます。delimiter、または文字列を囲むために使用する文字を定義するには、次のようにパーセント記号の後に指定します。

%$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 {} +`も表示されます。 `%

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
}

_https://en.wikipedia.org/wiki/Here_document [heredoc] _、または「here document」を使用して、複数行の文字列を作成することもできます。これは、プログラムで複数行の文字列リテラルに使用される用語です。 そのコードの書き方は次のとおりです。

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 heredoc」構文が提供されます。 ヒアドキュメント定義のハイフンをチルダに置き換えると、次のように `+ <←`が ` <<〜+`になります。

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.

これにより、heredocsを使用して、コードを適切にインデントできます。

RubyのHeredocsは文字列の補間もサポートしています。

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

文字列の複製

Rubyを使用して文字列を数回繰り返す必要がある場合があります。 これは、 `+ * `演算子を使用して実行できます。 `+`演算子と同様に、 ` * `演算子は、数値で使用する場合とは異なる用途があり、乗算の演算子です。 1つの文字列と1つの整数を使用する場合、 ` * +`は_string replication operator_であり、指定した整数を何度でも使用して1つの文字列を繰り返します。

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

print "Sammy" * 9

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

OutputSammySammySammySammySammySammySammySammySammy

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

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

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

それはこの出力を作り出します:

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

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

結論

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