Rubyで文字列メソッドを操作する方法

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

序章

Ruby strings には、多くのプログラムで一般的なタスクであるテキストの変更と操作を簡単にする多くの組み込みメソッドがあります。

このチュートリアルでは、文字列メソッドを使用して文字列の長さを決定し、文字列にインデックスを付けて分割し、サブ文字列を抽出し、空白やその他の文字を追加および削除し、文字列内の文字の大文字と小文字を変更し、テキストを検索して置換します。 完了すると、これらのメソッドを独自のプログラムに組み込むことができるようになります。

文字列の長さの決定

文字列メソッドlengthは、文字列内の文字数を返します。 この方法は、パスワードの最小長または最大長を強制する必要がある場合、または省略形として使用するために特定の制限内に収まるように大きな文字列を切り捨てる必要がある場合に役立ちます。

文の長さを出力する例を次に示します。

open_source = "Sammy contributes to open source."
print open_source.length
Output33

文字、数字、空白文字、記号を含むすべての文字は文字列の一部であるため、カウントされることに注意してください。

文字列が空かどうかを確認するには、文字列の長さが0かどうかを確認するか、empty?メソッドを使用できます。

name = ""
name.empty?    # true

name = "Sammy"
name.empty?    # false

name = "     "
name.empty?    # false

文字列にインデックスを付け、文字列の内容にアクセスする方法を見てみましょう。

文字列内の文字へのアクセス

文字列内の一部の文字を印刷または操作するには、sliceメソッドを使用して、必要な部分を取得します。

arrays のように、各要素はインデックス番号に対応し、文字列の各文字もインデックス番号0から始まるインデックス番号に対応します。

文字列Sammyの場合、インデックスの内訳は次のようになります。

0 1 2 3 4
S a m m y

sliceメソッドを使用すると、単一の文字または文字の範囲を取得できます。 単一の整数を渡すと、そのインデックスの文字が返されます。 2つの整数をコンマで区切って渡すと、sliceに、最初のインデックスから最後のインデックスまでのすべての文字を返すように指示されます。 sliceメソッドは、1..4などの範囲を受け入れて、抽出する文字を指定します。

"Sammy".slice(0)     # "s"
"Sammy".slice(1,2)   # "am"
"Sammy".slice(1..4)  # "ammy"

[]構文はsliceのエイリアスであるため、文字列を配列のように扱うことができます。

"Sammy"[0]     # "s"
"Sammy"[1,2]   # "am"
"Sammy"[1..4]  # "ammy"

負のインデックスを持つ文字列の最後から1文字にアクセスすることもできます。 -1を使用すると文字列の最後の文字にアクセスでき、-2は最後から2番目の文字にアクセスできます。

最後に、charsメソッドを使用して、文字列を文字の配列に変換できます。

"sammy".chars    # ["S", "a", "m", "m", "y"]

これは、文字列内の文字を操作または変換する場合に役立ちます。

次に、文字列内の文字の大文字と小文字を変更する方法を見てみましょう。

大文字と小文字への変換

upcaseおよびdowncaseメソッドは、元の文字列のすべての文字が大文字または小文字に変換された文字列を返します。 文字以外の文字列内の文字は変更されません。

文字列Sammy Sharkをすべて大文字に変換してみましょう。

name = "Sammy Shark"
print name.upcase
OuputSAMMY SHARK

次に、文字列をすべて小文字に変換しましょう。

print name.downcase
Ouputsammy shark

upcaseおよびdowncase関数を使用すると、大文字と小文字を一貫させることで、文字列の評価と比較が簡単になります。 たとえば、ユーザー名を要求し、ユーザーが大文字でユーザー名を入力した場合、ユーザーの入力を小文字にして、既知の小文字の値と比較できます。

Ruby文字列には、最初の文字を大文字にした新しい文字列を返すcapitalizeメソッドもあります。

"sammy".capitalize    # "Sammy"

これは便利な方法ですが、使用方法には注意してください。 最初の文字を大文字にするだけなので、必要なユースケースに必ずしも適合するとは限りません。

Rubyには、大文字と小文字が入れ替わった文字列を返すswapcaseメソッドも用意されています。

text = "Sammy"
print text.swapcase
sAMMY

downcaseupcasecaptalize、およびswapcaseメソッドはすべて新しい文字列を返し、既存の文字列は変更されません。 これは、テキストをすぐに印刷する以外のことをしている場合は覚えておくことが重要です。 次の例を見てください。

text = "sammy"
text.capitalize

print "Hello, #{text}!"
OutputHello, sammy!

text変数でcapitalizeを呼び出しましたが、capitalizeによって返される値をキャプチャすることはありませんでした。 プログラムを次のように書き直す必要があります。

text = "sammy"
text = text.capitalize

print "Hello, #{text}!"
OutputHello, Sammy!

代わりに、downcase!upcase!capitalize!、およびswapcase!を使用して、元の文字列を変更できます。

text = "sammy"
text = text.capitalize!

print "Hello, #{text}!"

ただし、注意してください。 元の文字列を変更することには欠点があります。 Rubyには両方の方法が用意されているため、ニーズに合った方法を選択できます。

次に、文字列に空白を追加および削除しましょう。

文字列のパディングとストリッピング

テキストをフォーマットする必要のあるプログラムを作成している場合、他のデータと整列させるために、文字列の前、後、または周囲にスペースを追加したい場合がよくあります。 また、余分な空白や特殊文字など、文字列の最初または最後から不要な文字を削除したい場合もあります。

文字列をスペースで囲むには、centerメソッドを使用します。

"Sammy",center(21)    # "        Sammy        "

別の文字を使用する場合は、2番目の引数として文字列を指定できます。

" [Sammy] ".center(21, "<>")   # "<><><> [Sammy] <><><>"

ljustおよびrjustメソッドは、文字列の左側または右側にスペースまたは文字を追加し、centerメソッドとまったく同じように機能します。

"Sammy".ljust(20)         # "Sammy               "
"Sammy".rjust(20)         # "               Sammy"
"Sammy".rjust(20, "!")    # "!!!!!!!!!!!!!!!Sammy"

文字列から先頭のスペースを削除するには、rstripメソッドを使用します。 末尾のスペースを削除するには、lstripを使用します。 stripを使用して、先頭と末尾の両方のスペースを削除します。

"        Sammy".rstrip    # "Sammy"
"Sammy        ".lstrip    # "Sammy"
"      Sammy  ".strip     # "Sammy"

center!ljust !、 rjust!lstrip!rstrip!、およびstrip!メソッドを使用して変更できます元の文字列。

文字列の末尾から文字を削除する必要がある場合があります。 Rubyのchopメソッドはまさにそれを行います。 文字列から最後の文字を削除します。

"Sammy".chop     # "Samm"

これは、文字列から改行文字(\n)を削除する場合に特に便利です。

"This string has a newline\n".chop

chopメソッドは元の文字列をそのまま残し、新しい文字列を返します。 chop!メソッドは、既存の文字列を変更します。

chompメソッドは、文字列の末尾から複数の文字を削除できます。

"Sammy".chomp("my")    # "Sam"

削除する文字列を指定しない場合、chompは改行を削除します。

"This string has a newline\n".chomp   # "This string has a newline

ただし、文字列に改行文字が含まれていない場合、chompは元の文字列を返すだけです。

"Sammy".chomp     # "Sammy"

これにより、改行を削除するときにchompを使用する方が、常に最後の文字を削除するchopメソッドよりも少し安全になります。

Rubyにはchomp!メソッドがあり、元の文字列を変更し、置換を実行した場合は変更された文字列を返します。 ただし、chompとは異なり、chomp!メソッドは、文字列を変更しなかった場合、nilを返します。

string = "Hello\n"
string.chomp!     # "Hello"

string = "Hello"
string.chomp!     # nil

次に、文字列内のテキストを検索する方法を見てみましょう。

文字とテキストの検索

文字列に別の文字列が含まれているかどうかを判断する必要がある場合があります。

include?メソッドは、文字列に別の文字列が含まれているかどうかを確認します。 文字列が存在する場合はtrueを返し、存在しない場合はfalseを返します。

"Sammy".include?("a")   # true
"Sammy".include?("b")   # false

indexメソッドは、文字のインデックスを返します。 また、部分文字列の最初の文字のインデックスを識別することもできます。 また、文字または部分文字列が存在しない場合は、nilを返します。

"Sammy".index("a")     # 1
"Sammy".index("mm")    # 2
"Sammy".index("Fish")  # nil

ただし、indexメソッドは、最初の発生のみを検出します。 文字列が長い例を次に示します。

text = "Sammy has a balloon"
text.index("a")    # 1

文字列Sammy has a balloonには、文字「a」が4回出現します。 しかし、indexは最初の発生のみを検出しました。 他の発生の1つを見つけるには、より具体的なものを作成する必要があります。

たとえば、文字列を文字の配列に変換し、配列メソッドを使用して結果を反復処理し、文字のインデックスを選択できます。 これを行うための1つの方法は次のとおりです。

text = "Sammy has a balloon"
indices = text.chars
  .each_with_index
  .select{|char, index| char == "a" }
  .map{|pair| pair.last}

print indices
[1, 7, 10, 13]

each_with_indexは、各文字のエントリとそのインデックスを含む2次元配列を返します。 selectは、文字がaであるエントリのみに絞り込み、mapは2次元配列をインデックスの1次元配列に変換します。

文字列内の文字を検索することに加えて、start_with?メソッドを使用して、文字列が文字またはサブ文字列で始まるかどうかを確認できます。

text = "Sammy has a balloon"
text.start_with?("s")         # true
text.start_with?("Sammy has"  # true

start_with?メソッドは複数の文字列を受け入れ、それらのいずれかが一致する場合はtrueを返します。

text = "Sammy has a balloon"
text.start_with?("Sammy the Shark", "Sammy") # true

この例では、「Sammy the Shark」は見つかりませんが、「Sammy」は見つかっているため、戻り値はtrueです。

end_with?メソッドを使用して、文字列が指定されたサブ文字列で終わるかどうかを確認できます。 start_with?とまったく同じように機能します。

text = "Sammy has a balloon"
text.end_with?("balloon")               # true
text.end_with?("boomerang")             # false
text.end_with?("boomerang", "balloon")  # true

テキストを見つける方法を見てきましたので、そのテキストを別のテキストに置き換える方法を見てみましょう。

文字列内のテキストの置換

ワードプロセッサの検索と置換機能を使用すると、文字列を検索して別の文字列に置き換えることができます。 これは、Rubyでsubおよびgsubメソッドを使用して実行できます。

subメソッドは、文字列の一部を別の文字列に置き換えます。

サミーはもう風船を持っていません。 それは飛び去った。 サブストリング"has""had"に変更してみましょう。

balloon = "Sammy has a balloon"
print balloon.sub("has","had")

出力は次のようになります。

OuputSammy had a balloon.

subメソッドは、一致の最初の出現を新しいテキストに置き換えるだけです。 hasという単語が2回出現する変更された文字列を使用してみましょう。

balloon = "Sammy has a balloon. The balloon has a ribbon"
print balloon.sub("has","had")
OutputSammy had a balloon. The balloon has a ribbon

最初の発生のみが変更されました。

それらをすべて変更するには、gsubメソッドを使用します。このメソッドは、グローバル置換を実行します。

balloon = "Sammy has a balloon. The balloon has a ribbon"
print balloon.gsub("has","had")
OutputSammy had a balloon. The balloon had a ribbon

subおよびgsubメソッドは常に新しい文字列を返し、元の文字列は変更されません。 文字列の「balloon」を「boomerang」に変更して、これを示しましょう。

text = "Sammy has a balloon"
text.gsub("ballooon", "boomerang")
print text
OutputSammy has a balloon

置換を指定したものの、gsubの結果を新しい変数に割り当てなかったため、出力には探している結果が表示されません。 希望する結果を得るには、次のようにプログラムを書き直すことができます。

text = "Sammy has a balloon"
text = text.sub("ballooon", "boomerang")
print text

または、代わりにsub!を使用して、元の文字列を変更することもできます。 文字列をいくつか置き換えて、これを試してみましょう。 「赤い風船」を「青いブーメラン」に変更します。

text = "Sammy has a red balloon"
text.sub!("red", "blue")
text.sub!("balloon", "boomerang")
print text
OutputSammy has a blue boomerang

gsub!メソッドを使用して、グローバル置換を実行することもできます。

subおよびgsubメソッドは、検索パターンに正規表現を受け入れます。 文字列内のすべての母音を@記号に置き換えてみましょう。

"Sammy has a red balloon".gsub /[aeiou]/, "@"
"S@mmy h@s @ r@d b@ll@@n"

置換値は文字列である必要はありません。 ハッシュを使用して、個々の文字またはピースを置き換える方法を指定できます。 文字aのすべての出現箇所を@に置き換え、すべてのo文字をゼロに置き換えましょう。

"Sammy has a red balloon".gsub /[aeiou]/, {"a" => "@", "o" => "0"}
# "S@mmy h@s @ rd b@ll00n"

これを使用して、より少ないコードでより複雑な置換を実行できます。

結論

このチュートリアルでは、文字列データ型の組み込みメソッドのいくつかを使用して、文字列を操作および操作しました。 また、文字列を操作する方法の多くには2つのバリエーションがあることも学びました。1つは文字列を変更しないままにする方法、もう1つは元の文字列を変更する方法です。 どちらを使用するかは、ニーズによって異なります。 Rubyを使用すると、データの操作方法を柔軟に選択できます。 ただし、既存のデータを変更しないコードを作成すると、後でデバッグする方が簡単な場合があります。

Rubyでデータを操作する方法を引き続き検討するには、これらの関連チュートリアルを必ず確認してください。