勉強メモ

主にプログラミングの勉強メモ

Ruby 文字列の主なメソッド

文字列に関するメソッドのメモ。

生成

ダブルクォート、シングルクォートで囲んで生成する方法以外にもいろいろある。

%Q %q

ダブルクォートなどを含んだ文字列を簡単に作れる

str1 = %Q|aaa bbb "ccc" 'ddd'|
str2 = %q{あああ bbb ccc}
p str1 #> "aaa bbb \"ccc\" 'ddd'"
p str2 #> "あああ bbb ccc"

ヒアドキュメント

# 変数に代入
str =<<- "EOF"
aaa
bbb
ccc
EOF

10.times do |i|
print(<<-"EOF") # シングルクォートで囲むと i は展開されない
i: #{i}
EOF
end

sprintf, format

成形した文字列を返す。 フォーマット指定方法は以下を参照。 https://docs.ruby-lang.org/ja/latest/doc/print_format.html

文字列の長さ

length, size

文字数を返す。日本語の場合も文字数を返す。

bytesize

バイト数を返す。

文字列をつなげる

a + b

文字列a,b をつなげて、新しい文字列を作る

a.concat(b), a << b

文字列a にbをつなげる。破壊的メソッド。 + を使うより効率がいいので、理由がなければこちらを使うのがよい。

文字列を分割する

a.split(pattern, limit)

文字列または正規表現で分割する。

a = "hoge bbb ccc,aaaa.ddd"
p a.split() #>["hoge", "bbb", "ccc,aaaa.ddd"]
p a.split(' ', 2)
p a.split(/a+/) #>["hoge bbb ccc,", ".ddd"]

chop, chomp

chop は文字列の末尾を削る。 chomp は改行文字の場合のみ削る。

# ファイルから一行ずつ読み込むときによく使う。
f.each_line do |line|
  line.chomp!
  # 何か処理
end

検索と置換

a.index(str), a.rindex(str)

文字列が存在する場合は、そのインデックスを返す。

a.include?(str)

a に str が含まれる場合は true を返す。 インデックスが不要ならこちらを使う。

a.sub(pattern, str), a.gsub(pattern, str)

文字列a で pattern マッチした個所をstr で置き換える。 sub は一か所だけ置き換え、 gsub はマッチした個所すべてを置き換える。どちらもブロックを引数にとり、マッチした個所に処理を加えて返すことができる。

str = "abcdefgabc"
nstr = str.sub(/.a/) do |matched|
  '<' + matched.upcase + '>'
end
p nestr #=>"abcdef<GA>bc"

a.scan(pattern)

pattern にマッチした個所を返す。

str = "akasatanahamararawa"
p str.scan(/.a/) #=>["ka", "sa", "ta", "na", "ha", "ma", "ra", "ra", "wa"]

# 正規表現キャプチャとの組み合わせ
p str.scan(/(.)(a)(/) #=>[["k", "a"], ["s", "a"], ["t", "a"], ["n", "a"], ["h", "a"], ["m", "a"], ["r", "a"], ["r", "a"], ["w", "a"]]