Ruby Language
文字列
サーチ…
構文
- 'A string' //一重引用符でリテラルを指定して文字列を作成する
- "A string" //二重引用符でリテラルを指定して文字列を作成する
- String.new( "文字列")
- %q(A string)//単一引用符付き文字列を作成するための代替構文
- %Q(A string)//二重引用符で囲まれた文字列を作成するための代替構文
一重引用符と二重引用符の違い
主な違いは、二重引用符で囲まれたString
リテラルが文字列の補間とエスケープシーケンスのフルセットをサポートすることです。
たとえば、補間による任意のRuby式を含めることができます。
# Single-quoted strings don't support interpolation
puts 'Now is #{Time.now}'
# Now is #{Time.now}
# Double-quoted strings support interpolation
puts "Now is #{Time.now}"
# Now is 2016-07-21 12:43:04 +0200
二重引用符で囲まれた文字列は、 "\n"
、 "\t"
などのエスケープシーケンス全体をサポートします。
puts 'Hello\nWorld'
# Hello\nWorld
puts "Hello\nWorld"
# Hello
# World
単一引用符で囲まれた文字列はエスケープシーケンスをサポートしませんが 、一重引用符で囲まれた文字列が有用であるために必要な最小限の設定をサポートしています:リテラル単一引用符とバックスラッシュ、それぞれ'\''
と'\\'
。
文字列の作成
Rubyは、 String
オブジェクトを作成するいくつかの方法を提供します。最も一般的な方法は、一重引用符または二重引用符を使用して " 文字列リテラル "を作成することです。
s1 = 'Hello'
s2 = "Hello"
主な相違点は、二重引用符で囲まれた文字列リテラルは、補間とバックスラッシュのエスケープシーケンスをサポートするため、少し柔軟性があるという点です。
任意の文字列区切り文字を使用して文字列リテラルを作成する他の方法もいくつかあります。任意の文字列区切り文字は%
後にマッチする区切り文字のペアです。
%(A string)
%{A string}
%<A string>
%|A string|
%!A string!
最後に、あなたが使用することができます%q
および%Q
と同等であるシーケンスを、 '
および"
「:
puts %q(A string)
# A string
puts %q(Now is #{Time.now})
# Now is #{Time.now}
puts %Q(A string)
# A string
puts %Q(Now is #{Time.now})
# Now is 2016-07-21 12:47:45 +0200
%q
および%Q
シーケンスは、文字列に一重引用符、二重引用符、または両方の組み合わせが含まれている場合に便利です。このようにして、コンテンツをエスケープする必要はありません。
%Q(<a href="/profile">User's profile<a>)
一致するペアがある限り、複数の異なるデリミタを使用できます。
%q(A string)
%q{A string}
%q<A string>
%q|A string|
%q!A string!
文字列連結
+
演算子で文字列を連結する:
s1 = "Hello"
s2 = " "
s3 = "World"
puts s1 + s2 + s3
# => Hello World
s = s1 + s2 + s3
puts s
# => Hello World
または<<
演算子を使用して:
s = 'Hello'
s << ' '
s << 'World'
puts s
# => Hello World
<<
演算子は、左側のオブジェクトを変更することに注意してください。
また、文字列を掛けることもできます。
"wow" * 3
# => "wowwowwow"
文字列補間
二重引用符"
と%Q
シーケンスは#{ruby_expression}
を使って文字列補間をサポートしています:
puts "Now is #{Time.now}"
# Now is Now is 2016-07-21 12:47:45 +0200
puts %Q(Now is #{Time.now})
# Now is Now is 2016-07-21 12:47:45 +0200
ケース操作
"string".upcase # => "STRING"
"STRING".downcase # => "string"
"String".swapcase # => "sTRING"
"string".capitalize # => "String"
これらの4つの方法は元の受信機を変更しません。例えば、
str = "Hello"
str.upcase # => "HELLO"
puts str # => "Hello"
同じアクションを実行するが、元の受信者を変更する4つの同様のメソッドがあります。
"string".upcase! # => "STRING"
"STRING".downcase! # => "string"
"String".swapcase! # => "sTRING"
"string".capitalize! # => "String"
例えば、
str = "Hello"
str.upcase! # => "HELLO"
puts str # => "HELLO"
ノート:
- Ruby 2.4以前では、これらのメソッドはUnicodeを処理しません。
ストリングの分割
String#split
、 String
を区切り文字に基づいてArray
にString#split
ます。
"alpha,beta".split(",")
# => ["alpha", "beta"]
空のString
空のArray
ます。
"".split(",")
# => []
一致しないデリミタは、単一の項目を含むArray
ます。
"alpha,beta".split(".")
# => ["alpha,beta"]
正規表現を使用して文字列を分割することもできます。
"alpha, beta,gamma".split(/, ?/)
# => ["alpha", "beta", "gamma"]
区切り文字は省略可能です。デフォルトでは、文字列は空白で分割されます。
"alpha beta".split
# => ["alpha", "beta"]
弦の結合
Array#join
は、区切りString
に基づいてArray
をString
にArray#join
ます。
["alpha", "beta"].join(",")
# => "alpha,beta"
区切り文字は省略可能で、デフォルトは空文字String
です。
["alpha", "beta"].join
# => "alphabeta"
空のArray
は、どのデリミタが使用されていても、空のString
になります。
[].join(",")
# => ""
複数行の文字列
複数行の文字列を作成する最も簡単な方法は、複数の行を引用符で囲むだけです。
address = "Four score and seven years ago our fathers brought forth on this
continent, a new nation, conceived in Liberty, and dedicated to the
proposition that all men are created equal."
このテクニックの主な問題は、文字列に引用が含まれていると、文字列構文が破られることです。この問題を回避するには、代わりにheredocを使うことができます:
puts <<-RAVEN
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore—
While I nodded, nearly napping, suddenly there came a tapping,
As of some one gently rapping, rapping at my chamber door.
"'Tis some visitor," I muttered, "tapping at my chamber door—
Only this and nothing more."
RAVEN
Rubyは<<EOT
でシェル形式のドキュメントをサポートしていますが、終了テキストは行を開始する必要があります。それはコードのインデントをねじ込むので、そのスタイルを使う理由はあまりありません。残念なことに、文字列には、コード自体がどのようにインデントされているかに応じてインデントが設定されます。
Ruby 2.3では、先行する余分なスペースを取り除く<<~
を導入することで問題を解決しています。
def build_email(address)
return (<<~EMAIL)
TO: #{address}
To Whom It May Concern:
Please stop playing the bagpipes at sunrise!
Regards,
Your neighbor
EMAIL
end
パーセンテージ文字列は、複数行の文字列を作成するためにも機能します。
%q(
HAMLET Do you see yonder cloud that's almost in shape of a camel?
POLONIUS By the mass, and 'tis like a camel, indeed.
HAMLET Methinks it is like a weasel.
POLONIUS It is backed like a weasel.
HAMLET Or like a whale?
POLONIUS Very like a whale
)
補間とエスケープシーケンスを回避するには、いくつかの方法があります。
二重引用符の代わりに一重引用符:
'\n is a carriage return.'
パーセント文字列の小文字の
q
:%q[#{not-a-variable}]
ターミナル文字列をheredocで一重引用符で囲みます:
<<-'CODE' puts 'Hello world!' CODE
書式付き文字列
Rubyでは、プレースホルダを指定された配列の値に置き換えることによって、文字列に値の配列を挿入できます。
"Hello %s, my name is %s!" % ['World', 'br3nt']
# => Hello World, my name is br3nt!
プレースホルダは2つの%s
表され、値は配列['Hello', 'br3nt']
。 %
演算子は、文字列に配列の値を挿入するよう指示します。
文字列の置換
tr
メソッドは、最初の引数の文字が2番目の引数の文字に置き換えられた文字列のコピーを返します。
"string".tr('r', 'l') # => "stling"
パターンの最初のオカレンスだけを別の式に置き換えるには、 sub
メソッドを使用します
"string ring".sub('r', 'l') # => "stling ring"
パターンのすべての出現をその式に置き換えたい場合は、 gsub
"string ring".gsub('r','l') # => "stling ling"
文字を削除するには、2番目のパラメータに空の文字列を渡します
これらのすべてのメソッドで正規表現を使用することもできます。
これらのメソッドは文字列の新しいコピーを返すだけで、文字列を変更しないことに注意することが重要です。これを行うには、 tr!
を使う必要がありますtr!
、 sub!
とgsub!
メソッド。
文字列内のデータを理解する
Rubyでは、文字列は文字列としてのバイトの解釈方法を指定するエンコーディング名( UTF-8
、 US-ASCII
、 ASCII-8BIT
)とともにバイトシーケンスです。
Ruby文字列はテキスト(基本的に文字列)を保持するために使用できます。この場合、通常はUTF-8エンコーディングが使用されます。
"abc".bytes # => [97, 98, 99]
"abc".encoding.name # => "UTF-8"
Ruby文字列は、バイナリデータ(バイトのシーケンス)を保持するためにも使用できます。この場合、ASCII-8BITエンコーディングが通常使用されます。
[42].pack("i").encoding # => "ASCII-8BIT"
文字列内のバイト列がエンコーディングと一致しない可能性があり、文字列を使用しようとするとエラーが発生する可能性があります。
"\xFF \xFF".valid_encoding? # => false
"\xFF \xFF".split(' ') # ArgumentError: invalid byte sequence in UTF-8
文字列置換
p "This is %s" % "foo"
# => "This is foo"
p "%s %s %s" % ["foo", "bar", "baz"]
# => "foo bar baz"
p "%{foo} == %{foo}" % {:foo => "foo" }
# => "foo == foo"
詳細については、 String %
docsとKernel :: sprintfを参照してください。
文字列はで始まる
文字列がパターンで始まるかどうかを調べるには、 start_with?
方法は便利です
str = "zebras are cool"
str.start_with?("zebras") => true
また、パターンの位置をindex
で確認することもできindex
str = "zebras are cool"
str.index("zebras").zero? => true
文字列はで終わる
文字列がパターンで終わるかどうかを調べるには、 end_with?
方法は便利です
str = "I like pineapples"
str.end_with?("pineaaples") => false
文字列の配置
Rubyでは、文字列を左詰め、右詰め、または中央揃えにすることができます
文字列をljust
にするには、 ljust
メソッドを使用します。これには、新しい文字列の文字数を表す整数と、塗りつぶすパターンを表す文字列の2つのパラメータがあります。
整数が元の文字列の長さより大きい場合、新しい文字列は左寄せされ、オプションの文字列パラメータは残りの文字列を取ります。文字列パラメータが指定されていない場合、文字列はスペースで埋められます。
str ="abcd"
str.ljust(4) => "abcd"
str.ljust(10) => "abcd "
文字列をrjust
にするには、 rjust
メソッドを使用します。これには、新しい文字列の文字数を表す整数と、塗りつぶすパターンを表す文字列の2つのパラメータがあります。
整数が元の文字列の長さより大きい場合、新しい文字列は右揃えされ、オプションの文字列パラメータは残りの文字列を取ります。文字列パラメータが指定されていない場合、文字列はスペースで埋められます。
str = "abcd"
str.rjust(4) => "abcd"
str.rjust(10) => " abcd"
文字列を中央揃えにするには、 center
方法を使用しcenter
。これは、新しい文字列の幅を表す整数と元の文字列が埋められる文字列の2つのパラメータを取ります。文字列は中央に揃えられます。
str = "abcd"
str.center(4) => "abcd"
str.center(10) => " abcd "