String

デフォルトエンコーディング

Ruby2.0からデフォルトエンコーディングがUTF-8に。

文字列のエンコーディングを変更する

Stringオブジェクトは、自分自身のエンコーディング情報を持っている。これを変更するには

hoge = "Hoge".encode("EUC-JP")
p hoge.encoding

文字列やバイナリデータを16進数ダンプする

[0].scan(/[0-9a-f]{2}/)

16進数ダンプを文字列やバイナリデータに変換する

["48656c6c6f2c20776f726c64"].pack("H*")

文字列をBase64エンコード

require 'base64'
a = "Hellow World"
p Base64.encode64(a)
b = Base64.encode64(a)
p Base64.decode64(b)

文字列内で変数の展開

文字列内で変数を展開するには#{}を使う

a = "hoge"
puts "Hellow, #{a}"
puts "1 + 3 = #{1 + 3}"

単一引用符や二重引用符を含む文字列を扱う

バックスラッシュ\でエスケープできるが、連続して使うと読みづらいしミスの原因になる

puts "Hellow, \"Hoge\""

文字列の先頭に%おき、半角記号で文字列を囲めばそのまま単一引用符や二重引用符を使える(パーセント記法)。パーセント記法は二重引用符で囲んだ文字列と同じ扱いになる

puts %!"Hi", 'Yahoo'!
puts %!"1 + 3 =" '#{1 + 3}'!

ヒアドキュメントを使う

複数行に渡るような長い文字列を使いたい場合はヒアドキュメントを使う

puts <<EOF
やーこまったこまった
すげー困ってる困ってる
はっはっはっは
EOF

ヒアドキュメントを使って複数のshellコマンド実行結果を文字列に設定する

s= <<`EOS`
date
echo "-----------------------------"
ps
EOS

文字列の結合

# インスタンス自体に結合する場合
str1 = "Hellow"
str1 << " Ruby"
str1.concat(" World!")

# 返り値に結合した文字列を返す場合
str2 = "Hellow"
puts str2 + " World"

文字列を指定いた回数繰り返した値を返す

puts "Hey " * 3

大文字・小文字に揃える

s = "i love Ruby"

# 大文字に揃える
puts s.upcase     #=> "I LOVE RUBY"

# 小文字に揃える
puts s.downcase   #=> "i love ruby"

# 先頭のみ大文字に、残りは小文字に揃える
puts s.capitalize #=> "I love ruby"

upcase、downcase、capitalizeの後ろに!つけると破壊的な操作ができるけど、基本使わん。

大文字と小文字の入れ替え

……いつ使うんだこれ?

puts "i lOVE rUBY".swapcase #=> "I Love Ruby"

コマンドの実行結果を文字列として受け取る

コマンドをバッククォートで囲む。

puts `date`

部分文字列を取り出す

s = "Apple Banana Orange"

p s[0..4] #=> "Apple"
p s[6, 6] #=> "Banana"

# 範囲を指定すればその範囲の文字が、ピンポイント指定だと文字コードが返る
p s.slice(0,3)    #=> "App"
p s.slice(6)      #=> 'B'
p s.slice(13..18) #=> "Orange"

部分文字列を置き換える

s = "Apple Banana Orange"

# 範囲指定
s[0..4] = "Vine"  #=> s = "Vine Banana Orane"

# 開始地点と長さ指定
s[5, 6] = "Lemon" #=> s = "Vine Lemon Orange"

文字列を1文字ずつ処理する

"Hellow Ruby".each_char{|c| puts c}

文字列を1文字ずつバイトで処理する

"Hellow Ruby".each_byte{|c| puts c}

文字列を1行ずつ処理する

s = <<EOS
This is test.

Ruby, the Object Oriented Script Language.
EOS

s.each_line{|line| puts line}

文字列の先頭と末尾の空白文字を削除する

"   Hello, Ruby!   ".strip #=> "Hello, Ruby!"

文字列を整数に変換する

"999".to_i

文字列を浮動小数点に変換する

"10.1".to_f

8進数文字列を整数に変換する

"010".oct

16進数文字列を整数に変換する

"0xff".hex

ASCII文字<=>コード値に変換

p "R".bytes
p 82.chr
p "%c" % 82

文字列を中央寄せ・左詰め・右詰めする

CUIツールを作るとき便利

s = "Ruby"

# 10文字を基準にずらす
p s.center(10) #=> "   Ruby   "
p s.ljust(10)  #=> "Ruby      "
p s.rjust(10)  #=> "      Ruby"

「次」の文字列を取得する

シーケンシャルな識別子を出すときに使える、とあるが、なかなか使いドコロがなくて存在を忘れる。

p "9".succ    #>= "10"
p "a".succ    #>= "b"
p "AAA".succ  #>= "AAB"
p "A99".succ  #>= "B00"
p "A099".succ #>= "A100"

文字列中で指定したパターンにマッチする最初の文字列を置換する

s = "Apple Banana Apple Orange"

p s.sub("Apple", "Pine") #=> "Pine Banana Apple Orange"

文字列中で指定したパターンにマッチする全ての文字列を置換する

s = "Apple Banana Apple Orange"

p s.gsub("Apple", "Pine") #=> "Pine Banana Pine Orange"

文字列内に含まれる任意文字列の一を求める

見つからなかったらnilが返る

s = "Apple Banana Apple Orange"

p s.index("Apple")    #=> 0
p s.index("Banana")   #=> 6
p s.index("Apple", 6) #=> 13

p s.rindex("Apple")    #=> 13
p s.rindex("Apple", 6) #>= 0

文字列の末端の改行を削除する

入力受け取るときに大活躍

p "Hellow, Ruby!\n".chomp

文字列を任意の区切り文字で分割し配列にする

"001,TAKEUCHI Hitoshi,Yokohama".split(",") #=> ["001", "TAKEUCHI Hitoshi", "Yokohama"]