Rubyで文字列メソッドを使う方法

以下は、日本語で自然に言い換えたものです。選択肢は一つだけです。

イントロダクション

Rubyの文字列は、多くの組み込みメソッドを持っており、テキストの修正や操作が容易に行えます。これは、多くのプログラムで行われる一般的な作業です。

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

文字列の長さを決定する。

「length」メソッドは、文字列内の文字数を返します。このメソッドは、パスワードの最小または最大文字数を制限する必要がある場合や、大きな文字列を略語として使用するために特定の制限内に切り詰める必要がある場合などに役立ちます。

日本語で次の文章を言い換えてください。選択肢は1つだけ必要です。
「ここに、文の長さを出力する例があります。」

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

33

すべての文字、文字、数字、空白文字、および記号を含めて、文字列の一部としてカウントされることを忘れないでください。

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

name = ""
name.empty? # true

name = "Sammy"
name.empty? # false

name = " "
name.empty? # false

文字列のインデックス付けおよび文字列の内容へのアクセス方法を見てみましょう。

文字列内の文字にアクセスする

日本語でのネイティブなパラフレーズを提供します:

特定の文字列を印刷したり操作する場合は、スライスメソッドを使用して必要な部分を取得してください。

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

ストリングの「Sammy」に対するインデックスの分布は、以下のようになります。

0 1 2 3 4
S a m m y

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

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

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

"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(小文字)のメソッドは、元の文字列のすべての文字を大文字または小文字に変換した文字列を返します。 文字列に含まれる文字で、letters(アルファベット文字)でないものは変更されません。

「Sammy Shark」という文字列をすべて大文字に変換しましょう。

name = "Sammy Shark"
print name.upcase
Ouput

SAMMY SHARK

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

print name.downcase
Ouput

sammy shark

upcase(大文字に変換する)とdowncase(小文字に変換する)の機能により、文字列の評価と比較が容易になり、大文字・小文字を統一することができます。例えば、ユーザー名を求め、ユーザーが大文字で入力した場合、ユーザーの入力を小文字に変換し、小文字の既知の値と比較することができます。

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

"sammy".capitalize # "Sammy"

これは便利な方法ですが、使い方には注意してください。最初の文字だけを大文字にするため、必ずしも必要な使い方に合わないこともありますので。

Rubyには、文字の大文字と小文字を入れ替えた文字列を返すswapcaseメソッドもあります。

text = "Sammy"
print text.swapcase
sAMMY

downcase、upcase、capitalize、swapcaseのメソッドはすべて新しい文字列を返し、既存の文字列を変更しません。この点は、テキストをすぐに印刷する以外のことを行っている場合に覚えておくと重要です。次の例をご覧ください。

text = "sammy"
text.capitalize

print "Hello, #{text}!"
Output

Hello, sammy!

テキスト変数にcapitalizeを呼び出しましたが、capitalizeが返した値を取得する必要がありませんでした。次のようにプログラムを書き直す必要があります。

text = "sammy"
text = text.capitalize

print "Hello, #{text}!"
Output

Hello, 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"

新しい行を削除する際、いつも最後の文字を削除するchopメソッドと比べて、chompメソッドは少し安全に使用できます。

Rubyには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

インデックスメソッドは最初の出現箇所しか見つけられません。ここに長い文字列の例があります。

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

「サミーが持っている風船」という文字列には、「a」という文字が4つあります。しかし、インデックスは最初の出現箇所しか見つけられませんでした。他の出現箇所を特定するために、もっと具体的な指定を書く必要があります。

たとえば、文字列を文字の配列に変換し、配列メソッドを使用して結果を反復処理し、文字のインデックスを選択することができます。以下にそのための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は、各文字とそのインデックスを持つエントリーが含まれた二次元配列を返します。selectは、文字が「a」であるエントリーのみに絞り込み、mapは二次元配列を一次元配列に変換します。

文字列内で文字を検索するだけでなく、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

この例では、「サミー・ザ・シャーク」は見つかりませんが、「サミー」は見つかりますので、戻り値は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」メソッドは、文字列の一部を別の文字列で置き換えます。

サミーはもうバルーンを持っていない。それは飛んで行った。”持っている”の部分を”持っていた”に変えましょう。

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

出力結果はこのようになります。

Ouput

Sammy had a balloon.

subメソッドは、一致する最初の箇所のみを新しいテキストで置き換えます。言葉「has」の出現回数が2つある修正された文字列を使用しましょう。

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

Sammy had a balloon. The balloon has a ribbon

最初の出来事だけが変わった。

すべてを変更するために、グローバル置換を実行するgsubメソッドを使用してください。

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

Sammy had a balloon. The balloon had a ribbon

サブとgsubメソッドは常に新しい文字列を返し、元の文字列は変更されません。このことをデモンストレーションするために、文字列内の「balloon」を「boomerang」に変更してみましょう。

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

Sammy has a balloon

出力される結果が私たちが求めるものではないのは、置換を指定したにも関わらず、gsubの結果を新しい変数に割り当てていなかったからです。求める結果を得るためには、次のようにプログラムを書き直すことができます。

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

代わりに、元の文字列を変更するsub!を使用することもできます。いくつかの文字列の置換を行ってみましょう。”red balloon”を”blue boomerang”に変えてみましょう。

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

Sammy 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つのバリアントがあることも学びました。

あなたが使用するのは、あなたのニーズによります。 Rubyは、データとの作業方法を選ぶ柔軟性を提供します。ただし、既存のデータを変更しないコードを書くことは、後でデバッグが容易になる場合があります。

これらの関連チュートリアルを必ず参照してください。Rubyでデータを扱う方法のさらなる探求を続けるために役立ちます。

  • How To Work with Strings in Ruby
  • How To Work with Arrays in Ruby
  • Understanding Data Types in Ruby
  • How To Use Array Methods in Ruby
コメントを残す 0

Your email address will not be published. Required fields are marked *