これまで文字列の分割にはsplitメソッドを用いてきました。
しかし、それは1種類の文字の場合、例えば ”,” のような、だけで、複数の文字で分割しなければならない場合には対処できませんでした。
このような場合の解決策をいろいろ調べたのでメモとして残します。
異なる文字で文字列を分解するには、gsubメソッドとsplitメソッドを使う
考え方としては異なる文字を、同じ文字に置換してから分割すればいいらしい。
確かに、同じ文字にしてしまえばsplitメソッドを用いて分割ができますね。なるほどなるほど。
ですが、ここで問題になるのは、どうやって異なる文字を同じ文字に置換するかということです。
この問題の解決のためには、gsubメソッドを用いるといいらしいです。
gsubメソッドの使い方
gsubは正規表現のパターンにマッチした文字列をすべて置き換えるためのものです。
基本的な構文は以下の通りです。
置換対象の文字列.gsub(/置換前の文字列/,置換後の文字列)
対象の文字列から置換対象の文字を探し、指定した文字で置換するのがgsubメソッドです。
例えば、以下の文章で「Japanese」を「English」に置換したい場合、gsubメソッドを用いれば。文中全ての「Japanese」を「English」に置換できます。
【例文】
I will study Japanese in Japan. Because I like Japanese culture very much. But, I speak Japanese a little. So, I study hard.
#gsubの場合
article = "I will study Japanese in Japan. Because I like Japanese culture very much. But, I speak Japanese a little. So, I study hard."
article1 = article.gsub("Japanese", "English")
puts article1
#=> "I will study English in Japan. Because I like English culture very much. But, I speak English a little. So, I study hard."
subメソッドとの違いに注意
gsubメソッドと同じようなものにsubがあります。
ただし、気をつけておきたいのは、gsubメソッドが文中に出てきた全ての文字を置換するのに対し、subメソッドは最初に出てきたものだけが置換されるということです。
先程の例文でsubメソッドを使った場合、処理結果は以下のようになります。
#subの場合
article = "I will study Japanese in Japan. Because I like Japanese culture very much. But, I speak Japanese a little. So, I study hard."
article1 = article.sub("Japanese", "English")
puts article1
#=> "I will study English in Japan. Because I like Japanese culture very much. But, I speak Japanase a little. So, I study hard."
全てを置き換えるのがgsubメソッド、最初のものだけを置き換えるのがsubメソッドと覚えておくといいかもしれません。
異なる文字をgsubメソッドで置換し、splitで分割する
それではgsubとsplit両メソッドを使って、異なる文字がある場合の文字列の分解方法をみていきます。
そこで今回は、本日の日付と時刻を分解し、出力する場合を考えてみましょう。
参考問題は以下のとおりです。
入出力値
【入力値】
2022/11/1 19:00
【出力値】
2022
11
1
19
00
考え方
まずはデータを受け取ります。Stringで受け取りたいのでto_sを用います。
a = gets.to_s
受け取ったデータをsplitメソッドを用いて分割していきたいのですが、この受け取ったデータには ”/”、” “、”:” の異なる文字が入っているため分割ができません。
そこで、gsubメソッドを用いてこれらを「,」に変換し、splitメソッドで分割します。
a = a.gsub("/", ",").gsub(" ", ",").gsub(":", ",") #=> 2022,11,1,19,00
これでそれぞれの文字が「,」に変換されました。
それでは、splitメソッドを用いてデータを分割し、それらを出力しましょう。
puts a.split(",")
これで期待される値が出力できました。
今回記述したデータは以下のとおりです。
a = gets.to_s
a = a.gsub("/", ",").gsub(" ", ",").gsub(":", ",") #=> 2022,11,1,19,00
puts a.split(",")
まとめ
- 異なる文字をsplitメソッドで分割したい場合は、gsubメソッドを用いて異なる文字を同じ文字に置換する
- gsubメソッドに似ているものにsubメソッドがあるが、gsubメソッドが全ての文字を置換するのに対し、subメソッドは最初に出てきた文字のみを置換する
他にいい方法がありましたらご教授ください。
また誤っている箇所がありましたらご指摘ください。
参考サイト・資料