chroju.dev/blog

the world as code

Ruby基礎復習(2) Stringクラス

パーフェクトRuby p.148から学習。文字列ことStringクラス。

まずは基本操作系。

s = "hoge"
s.empty? # => false
s.length # => 4
s.size # => 4
s.bitesize # => 8
s.include?("og") => true

演算子での操作。

'hoge' + 'fuga' # => 'hogefuga'
'hoge' * 3 => 'hogehogehoge'

破壊的な文字列の追加。

s = "hoge"
s << "fuga" # => "hogefuga"
s.concat("piyo") # => "hogefugapiyo"

切り出し。

s = "hogefuga"
s.slice(3) # => "e"
s.slice(2,5) # => "gefu"
s.slice(-4,2) # => "fu"
s.slice(2..5) # => "gefu"

#sliceを使わず、以下記法でも同等。

s = "hogefuga"
s[3] # => "e"
s[2,5] # => "gefu"
s[-4,2] # => "fu"
s[2..5] # => "gefu"
s[//]

文字列の整形に関するメソッドいろいろ。特に#chop#chompとか紛らわしいとよく言われる。英単語の意味するところとしてchop=刻むってことで1文字削除されるのはわかるが、そこにmが足されると改行コードの削除になるのはなぜなんだろう。。。あと#squeezeなんかは使う場面がいまいち想像できない。

なお、ここにあるメソッドはすべて非破壊的。末尾に!を付けることで破壊的操作になる。

s = " aaa "
s.strip # => "aaa"
s.rstrip # => " aaa"
s.lstrip # => "aaa "

s = "aaa\n\n"
s.chomp # => "aaa\n"
s = "abcd"
s.chop # => "abc"

s = "aaaabbbbcccc"
s.squeeze # => "abc"
s.squeeze('ab') # => "abccc"

"ABC".downcase # => "abc"
"def".upcase # => "DEF"
"Abc".swapcase # => "aBC"
"tITle".capitalize # => "Title"

"abc".reverse # => "cba"

置換。第一引数で検索を行い、ヒットした箇所を第二引数で置換するか、あるいはブロックに引き渡して操作、という建て付けのよう。#subだと最初に一致したもののみ、#gsubだとヒットしたすべての箇所が置換される。これも破壊的、非破壊的の2種類あり。

"aaaa".sub("a","b") # => "baaa"
"24-1-365".gsub(/[0-9]+/) {|str| str.to_i.succ} # => 25-2-366

配列への変換。#splitで第一引数に指定した文字をセパレータとした分割が可能。第二引数には分割最大数が指定できる。また1文字ずつ操作したい場合は#each_charが使える。ブロックへの引き渡しも可能。似たところで#each_byteもある。

str = "Alice, Bob, Charlie"

str.split(",") # => ["Alice", "Bob", "Charlie"]
"Alice".each_char.to_a # => ["A","l","i","c","e"]