プログラミングをしていると、文字列を結合したい、文字列を抽出したいということがありますが、「どう記述するんだっけ」といつも調べている方はいないでしょうか。
僕もその一人で、決して全部を覚える必要はないと思っているのですが、調べるにも時間はかかるので一度まとめてみることにしました。
本記事では、Rubyの文字列操作について、やりたい操作ごとにまとめてみました。
操作ごとにまとめているので、単なるメソッドの書き方だけでなく、該当するメソッドが直接ない場合にも、別の方法を含めて記載しています。
忘れた時に調べやすく、復習しやすいように心がけていますので、一人でも多くの方に役立てていただけたら幸いです。
なお、記載しているプログラムは、Ruby2.7を使って動作確認をしています。
Rubyの文字列操作
必要な文字列操作として、以下の内容をとりあげます。
文字列を結合したい
最も単純なのは、+メソッドで結合する方法です。
Rubyでは、文字列と数値を+メソッドによって結合することはできません。数値を文字列に変換してから結合する必要があります。
s1 = "Hello" s2 = "Ruby" r = s1 + s2 puts r # -> HelloRuby
<<メソッドで、後方に結合することが可能です。
s1 = "Hello" s2 = "Ruby" r = s1 << s2 puts r # -> HelloRuby
concatでも後方に結合することができます。
s1 = "Hello" s2 = "Ruby" r = s1.concat(s2) puts r # -> HelloRuby
分割された配列の中身を結合したい場合は、joinを使います。
joinの引数に文字列同士の間に含めたい文字列を指定することができます。
a = ["Hello", "Ruby"] r = a.join(" ") puts r # -> Hello Ruby
式展開を使って文字列を埋め込むことで、結合させるようにすることもできます。
s1 = "Hello" s2 = "Ruby" r = "#{s1}#{s2}" puts r # -> HelloRuby
sprintfを使って書式指定をすることで、結合させるようにすることもできます。
s1 = "Hello" s2 = "Ruby" r = sprintf("%s%s", s1, s2) puts r # -> HelloRuby
文字列を抽出したい
文字列から一部を抽出するには、文字のインデックス(開始と終了)を指定することで切り出すことができます。
最初の文字はインデックス0から始まることに注意が必要です。
その他、sliceやmatchを使う方法もあります。
s = "Hello Ruby!!" r = s[6..9] puts r # -> Ruby
開始位置から抽出した文字数を指定することも可能です。
s = "Hello Ruby!!" r = s[6,4] puts r # -> Ruby
正規表現による指定も可能です。
s = "Hello Ruby!!" r = s[/Ruby/] puts r # -> Ruby
sliceを使っても上記と同様のことが可能です。
s = "Hello Ruby!!" r = s.slice(6..9) puts r # -> Ruby
s = "Hello Ruby!!" r = s.slice(/Ruby/) puts r # -> Ruby
matchは正規表現によって、該当する部分を抽出します。
正規表現の()で括った部分を取得するといったことも可能です。
s = "Hello Ruby" r = s.match("^.* (.*)$")[1] puts r # -> Ruby
文字列の長さを求めたい
文字列の長さを調べるには、size、lengthを使う方法があります。
どちらも同じ結果が得られるのですが、マルチバイト文字も1文字としてカウントし、バイト数を返すものではありません。
バイト数を調べるにはbytesizeを使います。
s = "Rubyテスト" r = s.size puts r # -> 7
s = "Rubyテスト" r = s.length puts r # -> 7
文字列を検索したい
文字列の中に、特定の文字列を含んでいるかどうかを検索するには、index、include?、=~、count、start_with?、end_with?を用いる方法があります。
indexは指定した文字列が含まれていれば、その文字列の開始位置を返します。
含まれない場合はnilを返します。
また、indexは文字列を先頭から検索していき、最初に見つけた開始位置を返しますが、後方から検索したい場合には、rindexを使用します。
s = "Hello Ruby" r = s.index("l") puts r # -> 2
s = "Hello Ruby" r = s.rindex("l") puts r # -> 3
include?は、引数に指定した文字列が含まれていればtrueを返し、含まれていなければfalseを返します。
s = "Hello Ruby" r = s.include?("Ruby") puts r # -> true
=~は、indexに正規表現を指定するのと同様で、正規表現にマッチした開始位置を返します。
s = "Hello Ruby" r = s =~ /l/ puts r # -> 2
countは、引数に指定した文字がいくつあるかを返します。
s = "Hello Ruby" r = s.count("l") puts r # -> 2
start_with?は、引数に指定した文字列で始まっていればtrueを返します。そうでない場合はfalseを返します。
s = "Hello Ruby" r = s.start_with?("Hello") puts r # -> true
end_with?は、引数に指定した文字列で終了していればtrueを返します。そうでない場合はfalseを返します。
s = "Hello Ruby" r = s.end_with?("Ruby") puts r # -> true
文字列を置換したい
文字列の置換は、replace、sub、gsub、trを用いる方法があります。
replaceは、指定した文字列に置き換えます。
s = "Hello Go" r = s.replace("Hello Ruby") puts r # -> Hello Ruby
subは、引数に指定した正規表現に該当する最初の1回を、第2引数で指定する文字列に置換します。
s = "Hello Go Go" r = s.sub("Go","Ruby") puts r # -> Hello Ruby Go
gsubは、該当する文字列のすべてを置換します。
s = "Hello Go Go" r = s.gsub("Go","Ruby") puts r # -> Hello Ruby Ruby
trは、第1引数に含まれれる文字を検索して、それを第2引数の文字列に置き換えます。
s = "Hello ruby" r = s.tr("r","R") puts r # -> Hello Ruby
文字列を削除したい
文字列の削除をするには、deleteを使う方法があります。
その他、slice!で抽出することで元も文字列から削除したり、置換後の文字列を空文字にすることでも実現できます。
s = "HelloRuby" r = s.delete("Hello") puts r # -> Ruby
文字列を配列に分割したい
文字列を特定の文字で区切って配列にするには、splitを使います。
CSVやTSVの各要素を配列に分割するような場面でよく使われます。
s = "JavaScript,Python,Java,Ruby,Go" r = s.split(",") puts r.inspect # -> [JavaScript,Python,Java,Ruby,Go]
文字列をトリミングしたい
文字列の前後から空白文字を削除(除去)するには、stripを用います。
空白文字には、”\t\r\n\f\v”も含まれます。
s = " Hello Ruby " r = s.strip puts r # -> 「Hello Ruby」
これ以外にも、末尾から改行コードを取り除くchompや、文字列の最後の文字を取り除くchopがあったりします。
文字列をパディングしたい
文字列の前後に何かの文字を付加することをパディング(詰め物)と呼びます。
左寄せをljust、中央寄せをcenter、右寄せをrjustを使って指定した文字列の長さにすることができます。
また、sprintfの書式指定を使うことでパディングすることもできます。
ljustは、指定した文字列長になるように、文字列後に指定した文字をパディングします。
s = "123" r = s.ljust(10, "0") puts r # -> 1230000000
centerは、指定した文字列長になるように、文字列前後に指定した文字をパディングします。
s = "123" r = s.center(10, "0") puts r # -> 0001230000
rjustは、指定した文字列長になるように、文字列前に指定した文字をパディングします。
s = "123" r = s.rjust(10, "0") puts r # -> 0000000123
文字列を大文字・小文字に変換したい
文字列をすべて大文字に変換するには、upcaseを使います。
s = "Ruby" r = s.upcase() puts r # -> RUBY
文字列をすべて小文字に変換するには、downcaseを使います。
s = "Ruby" r = s.downcase() puts r # -> ruby
swapcaseは、大文字を小文字に、小文字を大文字に変換します。
s = "Ruby" r = s.swapcase() puts r # -> rUBY
capitalizeは、文字列の先頭を大文字に、残りを小文字にすることができます。
s = "hello ruby" r = s.capitalize() puts r # -> Hello ruby
文字列を数値に変換したい
文字列を数値に変換するには、to_iを使います。
s = "123" r = s.to_i puts r # -> 123 puts r.class # -> Integer
数値を文字列に変換したい
数値を文字列に変換するには、Integerクラスのto_sまたはsprintfの書式指定で変換することができます。
n = 123 r = n.to_s puts r # -> 123 puts r.class # -> String
文字列が一致しているか確認したい
文字列同士が一致しているかどうかは、eql?、==、===を使うことができます。
s1 = "123" s2 = "123" r = s1.eql?(s2) puts r # -> true
s1 = "123" s2 = "123" r = s1 == s2 puts r # -> true
s1 = "123" s2 = "123" r = s1 === s2 puts r # -> true
大文字小文字を区別せずに比較したい場合は、casecmp?を使用します。
辞書順で比較し、同一の場合は0、比較元の文字列が大きい場合は1、比較先の文字列が大きい場合は-1を返します。
s1 = "Hello Ruby" s2 = "hello ruby" r = s1.casecmp(s2) puts r # -> 0
様々なメソッドを使いこなせるようになろう
実際の開発現場でも今回紹介した文字列操作はよく使われます。
どの言語でも文字列を操作するための便利な機能はたくさん用意されています。
特にRubyは種類が豊富で、今回紹介しきれなかった便利なメソッドがたくさんあります。
これらをできるだけ使うことで、生産性の向上、ミスの削減、読みやすいコードへつなげることができ、プログラマーとしても成長することができます。
今回は、Rubyの文字列操作についてまとめてみました。
参考になれば幸いです。
コメント