Rubyではさまざまなメソッドを使用して文字列(String)の操作が可能です。
「文字列の分割、検索、変換、置換、抽出、削除などを行いたい」
そんな方に向けて、この記事では文字列の使い方から基本的な操作方法について、解説していきます。
文字列を比較する
文字列を分割する
文字列を検索・調査する
文字列を変換・置換する
文字列の長さを調べる
文字列の連結・作成・追加
文字列の抽出・削除
文字列の繰り返し
この記事では文字列の基本から文字列で使えるさまざまなメソッドやその使い方について、まとめましたのでぜひ参考にしてください!
文字列の定義
RubyのStringクラスは文字列を表すオブジェクトです。
Rubyで文字列を定置する方法は簡単です。
基本的には変数を定義してイコール(=)で指定した文字列を代入すればOKです。
文字列の指定はダブルクオーテーション(“”)で文字列を囲って定義する必要があります。
変数 = ”文字列”
実際に文字列の定義方法を見てみましょう
str1 = "samurai" str2 = "engineer" p str1 p str2
このプログラムを実行すると、以下のように出力されます。
samurai engineer
次項からはそんなRubyの文字列について、さまざまな文字列操作のメソッドを紹介します!
比較
==(同じ文字列かどうか調べる)
文字列と文字列を比較するには「==」を使用します。
string_1 = "samurai" string_2 = "samurai" p string_1 == string_2 => true
<, <=, >, >=(文字列の順番の比較)
文字列を辞書的な順番で比較します。
word_1 = "hot" word_2 = "hotter" word_3 = "hottest" p word_1 < word_2 => true p word_1 > word_2 => false p word_1 <= word_3 => true p word_1 >= word_2 => false
<=>(文字列の順番の比較)
word_1 = "hotter" word_2 = "hot" word_3 = "hottest" p word_1 <=> word_2 => 1 p word_2 <=> word_3 => -1 p word_1 <=> word_3 => -1
casecmp(大文字小文字を区別しない比較)
比較の結果は「<=>」メソッドと同じ。
word_1 = "hot" word_2 = "hotter" word_3 = "hot" p word_1.casecmp(word_2) => -1 p word_1.casecmp(word_3) => 0
分割
split(文字列の分割)
文字列を分割して取得したい場合はsplitメソッドを使用します。
以下のサンプルではカンマ(,)区切りで文字列を取得しています。
string = "samraui, ruby, rails" p string.split(",") => ["samraui", " ruby", " rails"]
partition(部分文字列で2つに分割)
指定した部分文字列で分割したい場合はpartitionメソッドを使用します。
string = "samurai" p string.partition("u") => ["sam", "u", "rai"] # 文字列がない場合は空白文字を用いて分割される p string.partition("o") => ["samurai", "", ""]
rpartition(末尾から部分文字列で2つに分割)
指定した部分文字列で文字列の末尾から分割したい場合はrpartitionメソッドをを使用します。
string = "samurai" p string.rpartition("u") => ["sam", "u", "rai"] # 文字列がない場合は空白文字を用いて分割される p string.rpartition("o") => ["", "", "samurai"]
検索、調査
empty?(空文字列か調べる)
指定した文字列が空文字列かどうか調べたい場合はempty?メソッドを使用します。
string_1 = "Hello" p string_1.empty? => false string_2 = "" p string_2.empty? => true
start_with?(指定の文字列で始まっているか調べる)
string = "samurai, ruby" p string.start_with?("sa") => true
end_with?(指定の文字列で終わっているか調べる)
string = "samurai, ruby" p string.end_with?("by") => true
include?(部分文字列が含まれているか調べる)
string = "samurai, ruby" p string.include?("ruby") => true
index(部分文字列の位置を調べる)
部分文字列が含まれていれば、開始位置のインデックスを整数で返す
string = "samurai, ruby" p string.index("r") => 4 # 4文字目 # offsetを指定(○文字目から検索する) string = "samurai, ruby" p string.index("r", 5) # 5文字目から検索 => 9 # 9文字目
rindex(末尾から部分文字列の位置を調べる)
string = "samurai, ruby" p string.rindex("r") => 9 # 9文字目 # offsetを指定(末尾の○文字目から検索する) string = "samurai, ruby" p string.rindex("r", 5) # 末尾の5文字目から検索 => 9 # 9文字目
変換、置換
reverse, reverse!(文字列の反転)
指定した文字列を反転して取得したい場合はreverseまたはreverse!メソッドを使用します。
string = "samurai" p string.reverse => "iarumas" # reverse!はレシーバ自身を反転させる string = "samurai" p string.reverse! => "iarumas" p string => "iarumas"
capitalize, capitalize!(最初の文字を大文字にする)
最初の文字を大文字に、最初の文字以外は小文字にします。
string = "saMuraI, rUBy" p string.capitalize => "Samurai, ruby"
swapcase, swapcase!(小文字を大文字に、大文字を小文字に変換)
string = "saMuraI, rUBy" p string.swapcase => "SAmURAi, RubY"
replace(文字列を変更する)
指定した文字列でレシーバ自身を変更する。
string = "Samurai" string.replace("Hello") p string
downcase, downcase!(大文字を小文字にする)
string = "saMuraI, rUBy" p string.downcase => "samurai, ruby"
upcase, upcase!(小文字を大文字にする)
string = "saMuraI, rUBy" p string.upcase => "SAMURAI, RUBY" # upcase!はレシーバ自身を変更する
squeeze, squeeze!(同じ文字の繰り返しを1つにまとめる)
string = "rrruuuubbbbbyy" p string.squeeze => "ruby" # 引数を指定した場合は、その文字だけまとめる string = "rrruuuubbbbbyy" p string.squeeze("r") => "ruuuubbbbbyy"
tr, tr!(特定の文字を置換)
s = "samurai" p s.tr("sa", "cu") # sをcに、aをuに置換する => "cumurui"
tr_s, tr_s!(特定の文字を置換して1つにまとめる)
string = "AAAABBCCCDDDD" p string.tr_s("A-I", "1-9") # AからIを1から9に置き換えて重複をまとめる => "1234"
長さ
size(文字数(バイト数)を返す)
string = "Samurai" p string.size => 7
length(文字数(バイト数)を返す)
string = "Samurai" p string.length => 7
count(文字列中の特定の文字を数える)
string = "Samurai" p string.count("a") => 2
連結、作成、追加
+(文字列の連結)
string = "Samurai" p string + " World" => "Samurai World"
%(書式付き文字列の作成)
number = 10.0 / 3 p "%.4f" % num
*(繰り返し文字列の作成)
string = "Samurai" p string * 5 => "SamuraiSamuraiSamuraiSamuraiSamurai"
<<(文字列の追加)
string = "Samurai" string << ", World" p string => "Samurai, World"
succ, succ!(「次の文字列」を作る)
s = "abc" puts s.succ s = "abc123" puts s.succ
next, next!(「次の文字列」を作る)
succの別名。
string = "abcdef" p string.next => "abcdeg" string = "abcdef12345" p string.next => "abcdef12346"
insert(指定の位置に文字列を挿入)
string = "hello, samurai" string.insert(7, "ruby ") p string => "hello, ruby samurai" string.insert(-8, "school ") p string => "hello, ruby school samurai"
抽出、削除
chomp, chomp!(末尾の改行を取り除く)
string_1 = "samurai\n" string_2 = "samurai\r\n" string_3 = "samurai\r" p string_1.chomp => "samurai" p string_2.chomp => "samurai" p string_3.chomp => "samurai"
chop, chop!(末尾の文字を取り除く)
string = "samurai" p string.chop => "samura"
delete, delete!(文字列中の特定の文字を削除)
string = "hello, samurai" p string.delete("l") => "heo, samurai"
lstrip, lstrip!(先頭の空白を取り除く)
string = " hello, samurai" p string.lstrip => "hello, samurai"
rstrip, rstrip!(末尾の空白を取り除く)
string = "hello, samurai \r\n" p string.rstrip => "hello, samurai"
strip, strip!(先頭と末尾の空白を取り除く)
string = " hello, samurai \r\n" p string.strip => "hello, samurai"
slice(部分文字列の取り出し)
string = "samurai" p string.slice(1, 3) # 2番目から3文字分 => "amu" string = "hello, samurai" p string.slice(7..10) # 7文字目から10文字目まで => "samu"
slice!(部分文字列の削除)
string = "hello, samurai" p string.slice!(1) => "e" p string => "hllo, samurai"
chars(1文字ずつ取り出すRuby 1.8.7)
string = "さむらい" p string.chars => ["さ", "む", "ら", "い"]
chr(最初の文字を取り出すRuby 1.9)
string = "さむらい" p string.chr => "さ"
clear(文字列を空にするRuby 1.9)
string = "Hello" string.clear p string => ""
繰り返し
each_line(1行ずつ取り出す)
文字列を改行文字で分割して1行ずつ取り出す。
string = "line1\n line2 \r\n line3 \r line4" string.each_line {|line| p line.chomp } => "line1" " line2 " " line3 \r line4" # "\r"はデフォルトでは改行文字と見なされない
lines(1行ずつ取り出す)
string = "line1\n line2 \r\n line3 \r line4" string.lines {|line| p line.chomp } => "line1" " line2 " " line3 \r line4"
upto(指定の文字列まで「次の文字列」を繰り返す)
"ruby".upto("rucc") {|s| print s, ' ' } => ruby rubz ruca rucb rucc
その他
center(中央寄せ)
string = "samurai" p string.center(18) #長さを引き数で指定する。空白文字で中央寄せされる => " samurai " p string.center(18, "-") # 第二引数を指定すると、その文字で中央寄せされる => "-----samurai------"
rjust(右寄せ)
string = "samurai" p string.rjust(18) => " samurai" p string.rjust(18, "-") => "-----------samurai"
ljust(左寄せ)
string = "samurai" p string.ljust(18) => "samurai " p string.ljust(18, "-") => "samurai-----------"
encoding(文字コード情報を得るRuby 1.9)
string = "さむらい" p string.encoding => #
sum(チェックサムの値を返す)
文字列の各バイトの整数を合計し、下位ビットを取り出す。
string = "さむらい" p string.sum => 1972
ord(最初の文字のコードポイントを返す)
string = "さむらい" p string.ord => 12373
まとめ
ここでは、RubyでString(文字列)を扱う方法や便利なメソッドについて解説しました。
文字列の操作はプログラミングにおいて、最も基本的な処理の1つとなりますので、使い方についてはしっかりと理解しておきましょう。
もし、文字列の操作方法を忘れてしまったら、この記事を思い出してくださいね!