String(文字列)クラス

文字列作成の方法には3種類あります。また、配列と同じようにインデックス番号を指定して、処理を行う事が出来ます。

吉田先生

文字列は、連結や分割を行う事が出来ます。また、文字列同士の比較や検索を行う事も可能です。


文字列オブジェクトの作成

「" "」「' '」

これまでに何度も出てきている「" "」ダブルクオートを使った作り方です。「String.new」としなくても直接文字列を「" "」で囲えば文字列オブジェクトは作成できます。

「' '」と同様に「' '」シングルクオートも文字列を囲うだけで文字列オブジェクトを作成できます。ダブルクオートとシングルクオートの違いは特殊文字の解釈を行うか行わないかです。では「\n」という改行を行う特殊文字を使って違いを見てみましょう。

d = "あ\nい"
s = '\n'

puts d                                                                                                                                                                     
#
#

puts s
#\nl 

ダブルクオートは改行されシングルクオートは特殊文字の解釈を行わず特殊文字をそのまま表示していますね。またイテレータなどで出てきましたが「#{}」で囲われた部分にブロック変数を書くというような場合は、ダブルクオートとしないと変数の値を出力できません。

この例は特殊文字の表示についてでしたが、「\」バックスラッシュと「" "」「' '」ダブルクオート、シングルクオートの3つを文字列として扱いたい場合もあるかと思います。その際は「\」を使い記述しなければなりません。では例を見てみましょう。

test_d = "あ\い"""
#SyntaxError: (irb):1: syntax error, unexpected tIDENTIFIER, expecting end-of-input

d2 = "あ\\い\"\""

puts d2
#\"う"

1行目では文字列オブジェクトの中で「あいう」を「\」や「" "」で区切ろうとしています。しかしエラーが出ていますね。次のコードでは、「\」や「" "」の前に「\」を書いています。このようにすることで「\」や「" "」を文字列内に含めそのまま表示させることが出来ます。

*シングルクオートの場合も同様です。

%Qと%q

前セクションで「\」や「" "」を文字列として扱う方法をご紹介しましたが、この「%Q」や「%q」を使えば「\」を記述する必要なくそのまま文字列として表示する事が出来ます。ではやってみましょう。

double = %Q{ "い" ''}
single = %q| "い" ''| 

puts double
 #=> "い" ''
puts single
 #=> "い" ''

このようにそのまま表示されていますね。この「%Q」は「" "」、「%q」は「' '」で囲った場合と同等になります。

ヒアドキュメント

ヒアドキュメントという方法は「<<識別子」というものを使い記述します。書き方は以下のようになります。

&lt;&lt;"識別子(終了を表す文字列)"
文字列
文字列
識別子

識別子には文字列を設定します。識別子とする文字列は「" "」か「' '」で囲いましょう。では例を見てみましょう。

test = &lt;&lt;"EOS"                                                                                                                                                             
私は26
未年です。
EOS

print test
#私は26
#未年です。 

この方法は改行が多く必要なものなどを書きたいときに使用されます。この例の場合は識別子を「"EOS"」としています。これは「End Of String」とう意味です。この他にも「EOB(End Of Block)」や「EOF(End Of File)」などがよく使用されます。

最後の行に書く識別子は空白などを含めてはいけません。しかし、以下のように「<<-識別子」とすると最後に書く識別子の前に空白を入れることが出来ます。ブロック内に書くときなどはインデントが揃い見やすくなりますね。

2.times do 
  print(&lt;&lt;-"EOS")
テスト
テスト
  EOS
end
#テスト
#テスト
#テスト
#テスト

さらに、「テスト」という文字列の部分のインデントも気になるかと思います。こちらを合わせるには「<<~」という書き方を使います。

2.times do
  print(&lt;&lt;~"EOB")
    テスト
  EOB
end
#テスト
#テスト

「テスト」という文字列の前に空白を入れ書いていますが出力される際は空白を取り除いてくれます。

文字列の長さ

文字列の長さ、つまり文字数を調べるメソッドについては「length」と「size」をこれまでに取り上げました。では、新たに2つのメソッドをみてみましょう。

「bytesize」

文字列のバイト数を調べるメソッドです。

a = "こんにちは"

p a.bytesize
 #=> 15 

「empty?」

文字数が0かどうかを調べるメソッドです。文字列が空かどうかという事ですね。

b = ""

p a.empty?
 #=> false 

p b.empty?
 #=> true 

このように空であれば「true(真)」を返します。条件判断などの際に使えますね。

インデックス

配列のレッスンで取り上げたインデックスですが、文字列クラスでも使用する事が出来ます。文字列の中の〇番目の文字というような指定をインデックスを使い行います。

文字列or文字列を代入した変数[インデックス番号]

では先ほどのa = "こんにちは"という文字列のインデックス番号0のバイト数を調べてみます。

p a[0].bytesize
 #=> 3 

「こ」のバイト数は3という事ですね。

文字列の連結

文字列同士を連結する事も出来ます。この場合2種類3通りの方法があります。ではまず種類についてみてみましょう。

①非破壊的メソッドであり、文字列同士を連結し1つの文字列として返す。

②破壊的メソッドであり、片方の文字列にもう一方の文字列を取り込みその結果を新たな値とする。

では、3通りある方法についてみてみましょう。

「+」

種類①の方法です。

a = "coffee"
b = "milk"

cafe_au_lait = a + b 

p cafe_au_lait
 #=> "coffeemilk" 

p a
 #=> "coffee" 
p b
 #=> "milk" 

「a」と「b」を連結した新しい文字列「cafe_au_lait」が作成されていますね。非破壊的メソッドなので「a」と「b」の値は変更されていません。

「<<」と「concat」

これらのメソッドは種類②の方法です。では「<<」で試してみましょう。

a &lt;&lt; b

p a
 #=> "coffeemilk" 

p b
 #=> "milk" 

このようにメソッドの左側の変数の値が変更されます。右側の文字列を繋げた値に変更されるという事ですね。なお、このメソッドを使っても右側の変数の値はなくなるわけではなくそのままです。

「concat」も同様です。「<<」と同じ過程結果になります。書き方は以下のようになります。

a.concat(b)

文字列の比較

文字列が全く同じものかという事は「==」という演算子を使い比較します。同じであれば「true」が返ります。またこの逆で「!=」という演算子を使えば異なる文字列であることを調べられます。では、やってみましょう。

p "a" == "a"
 #=> true 
p "a" == "a "       #右辺の文字列はaの後ろに空白
 #=> false 

p "a" != "a"                                                                                                                                                               
 #=> false 
p "a" != "a "       #右辺の文字列はaの後ろに空白
 #=> true 

このように完全に一致しなければ同じ文字列とはみなされません。この比較は条件判断等でも使えそうですね。

a = [["あ", "あ"],["あ", "い"]]

a.each do |b, c|
  if b == c
    puts "#{b}と#{c}は同じです"
  else
    puts "#{b}と#{c}は違います"
  end
end
#あとあは同じです
#あといは違います

分割

文字列を指定の位置で分割する事が出来ます。これは文字列を分割し配列として返す「split」というメソッドを使います。書き方は以下のようになります。

文字列or文字列を代入した変数.split

上記の書き方の場合引数は指定していません。指定しなければ、空白で区切り分割します。

p "a a a".split                                                                                                                                                               
 #=> ["a", "a", "a"]

以下のように引数に区切り文字を指定する事も出来ます。

test = "チームA:田中"

p test.split(':')
 #=> ["チームA", "田中"] 

改行を示す特殊文字について

以下はブロックのレッスンで取り上げました、ファイルテキスト内の文字列を1行ずつ処理する「each_line」メソッドの例です。このように「p」を使って取り出すと、行の文字列の最後に改行を表す「\n」という特殊文字が入ってしまいます。

info.txt

参考書1:1600円
rubyについての本です。

参考書2:2200円
railsについての本です。

合計3800円

kaigyou.rb

File.open("info.txt") do |file|
  file.each_line do |line|
    p line
  end
end
"参考書1:1600円\n"
"rubyについての本です。\n"
"\n"
"参考書2:2200円\n"
"railsについての本です。\n"
"\n"
"合計3800円\n

このような場合には「chomp」というメソッドを使い改行文字を取り除きます。この「chomp」には破壊的メソッドである「chomp!」が存在します。では試してみましょう。

chomp.rb

File.open("info.txt") do |file|
  file.each_line do |line|
    p line.chomp
  end
end
"参考書1:1600円"
"rubyについての本です。"
""
"参考書2:2200円"
"railsについての本です。"
""
"合計3800円"

改行文字が取り除かれていますね。

検索を行う

〇という文字は文字列の中に含まれているかというように調べることができます。ではみていきましょう。

「index」と「rindex」

この2つは引数で指定した文字が文字列に含まれるかを調べ、文字列のどの場所に一致するものがあるかをインデックス番号で返します。違いは「index」は文字列の左側から調べ始め、「rindex」は右から調べ始めるという部分です。

test = "PonPonPon"                                                                                                                                                    

p test.index("Pon")
 #=> 0 

p test.rindex("Pon")
 #=> 6 

このようにインデックス番号を返します。なぜこの結果(インデックス番号)になるのかということは以下図を使って説明します。

この2つのメソッドで共通となるのは、2文字以上の文字で検索した場合一致した部分の先頭のインデックス番号を返すという事です。ですので「index」では0「rindex」では6が返り値となります。

「include?」

文字列内のどの位置に一致する文字があるかという情報が必要なければ、この「include?」メソッドを使いましょう。これは引数として指定した文字が含まれていれば「true(真)」を返すメソッドです。

条件判断で使う事が出来ますね。例としてはブロックの章の「each_line」メソッドの項目で、「include?」を使用していますので見てみてください。

配列のメソッド

配列のレッスンで様々なメソッドを紹介しました。これらは2つに分けることが出来ます。まず「Object」クラスのインスタンスメソッド、そして配列クラスのインスタンスメソッドです。

配列も文字列も「Object」のサブクラスですので「Object」クラスのインスタンスメソッドが配列でも文字列でも使えるのは当然ですね。そして配列のメソッド中には文字列でも使う事が出来るものがあります。では見てみましょう。

置き換え

文字の置き換えをインデックス番号を指定し行います。インデックス番号部分は範囲などでも指定できます。

a = "あいう"

a[2] = "す"
p a
 #=> "あいす"

slice / slice!

文字をインデックス番号を指定し取り除きます。こちらも範囲などでの指定もOKです。

a.slice!(2)

p a
 #=> "あい" 

「concat」と「+」

冒頭で取り上げましたこの2つは配列でも使われていましたね。

delete / delete!

引数で指定した文字を、文字列から取り除きます。

b = "あといとう"

p b.delete!("と")
 #=> "あいう" 

reverse

文字を逆に並べ替えます。

c = "くるみ"

p c.reverse!
 #=> "みるく"

文字列クラスのインスタンスメソッド

先ほどは、配列と文字列で共通のメソッドを紹介しました。こちらでは、文字列クラスのインスタンスメソッドを挙げていきます。

strip / strip!

文字列の先頭と末尾に空白が入っている場合取り除いて返してくれるメソッドです。

d = " hello! "

p d.strip!
 #=> "hello!"

大文字 / 小文字

このセクションでは文字列が大文字か小文字かを判断し変換してくれるメソッドの紹介をします。

upcase / upcase! 

小文字→大文字

p d
 #=> "hello!" 

p d.upcase
 #=> "HELLO!"

元々大文字である場合は、大文字のままです。

downcase / downcase!

大文字→小文字

p d.downcase
 #=> "hello!"

swapcase / swapcase! 

大文字→小文字

小文字→大文字

e = "Hello!"

p e.swapcase
 #=> "hELLO!" 

capitalize / capitalize!

1文字目→大文字

2文字目以降→小文字

f = "news!SPRING SALE!"

p f.capitalize
 #=> "News!spring sale!" 

tr / tr!

文字の置き換えを行います。引数でどの文字をどの文字に置き換えるのかを指定します。では見てみましょう。

test = "abcdefg"

p test.tr("a", "A")
 #=> "Abcdefg" 

p test.tr("ag", "AG")                                                                                                                                                       
 #=> "AbcdefG" 

p test.tr("a-g", "A-G")                                                                                                                                                     
 #=> "ABCDEFG"

1回目の呼び出しでは、1文字のみ置き換えるとしてしていますね。2回目は2文字指定しています。3回目は「a」から「g」までとし全て置き換えています。このように1つ目の引数に置き換えを行いたい文字、2つ目の引数は新たな値を指定します。

まとめ

文字列作成の方法には3種類あります。また、配列と同じようにインデックス番号を指定して、処理を行う事が出来ます。

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×