Rubyではsplitメソッドは、文字列を特定の文字列、または一定の規則で区切って配列にする処理です。似たような機能は多くのプログラム言語にもありますが、Rubyのsplitほどの機能はありません。しかし、splitメソッドのそういった機能を知らないのはもったいない。そこで、今回はsplitメソッドの基本といかにもRubyらしい応用例についてご紹介します。
文字列を配列に変換する機能
プログラムを作る際、文字列を加工したり、比較する処理をよく使います。中でも、文字列を一定の規則で区切って配列にする処理は、そういったよく使われる機能の一つです。
なお、この機能はいろいろなプログラム言語がサポートしていますが、Rubyでは英語で分裂させる、または、分割する、という意味のあるsplitを使います。
文字列を配列に変換する機能
splitメソッドを簡単に説明すると、文字列を扱うRuby標準のStringクラスのメソッドの一つで、引数で指定した区切り文字で文字列を分割し、配列として返します。
これだけ読めば、他のプログラム言語にある似た機能と同じものを思われる方もいるでしょう。しかし、splitメソッドの引数として指定できるのは文字列だけではありません。正規表現や範囲なども指定できるので、他のプログラム言語では複雑な処理でも、Rubyなら簡単に書けます。
また、splitメソッドは配列を返しますが、Rubyには配列を加工するメソッドもたくさんあるので、splitメソッドに続けて配列を加工するメソッドを追加することも可能です。
splitメソッドの文法
splitメソッドの基本は、文字列の変数に対して使用し、引数として区切り文字を指定します。なお、split
メソッドは、2つの引数を指定でき、1番目は区切り文字で、2番目は変換する配列の数です。そして、2番目の
引数を省略した場合は、配列は制限なく分割されます。また、1番目の引数も省略した場合は、空白文字で分割
されます。
str.split(pattern = $;, [limit])
strは、元の文字列
patternは、区切り文字
変換する配列の数を第2引数limitで指定してもよい。
例えば、「,」を含む文字列を、「,」を区切り文字として配列に変換する場合は、次のように使います。
moji = "tokyo,nagoya,osaka" arr = moji.split(",") # arr = ["tokyo", "nagoya", "osaka"]
また、生成する配列の数を制限したい場合は、次のように指定します。
moji = "tokyo,nagoya,osaka" arr = moji.split(",",2) # arr = ["tokyo", "nagoya,osaka"]
なお、splitメソッドの区切り文字に文字列も使えます。
moji = "tokyo nagoya osaka" arr = moji.split(",") # arr = ["tokyo", "nagoya", "osaka"]
splitメソッドの使い方
次から、splitメソッドのより詳しい使い方について、例を用いてご紹介します。
split()だけでも使える
splitメソッドで区切り文字を指定しなかった場合、対象の文字列の空白、改行、タブで分割されます。そのため例えば、空白文字で区切られた文字列は、split()に引数を指定しなくても、配列に分割できます。
split()を使った例 moji = "tokyo nagoya osaka" arr = moji.split(",") # arr = ["tokyo", "nagoya", "osaka"]
区切り文字に正規表現を使う
Rubyのsplitメソッドでは、区切り文字に正規表現を使うこともできます。例えば、コンマ(,)で区切られた文字列はプログラムでもよく使われますが、コンマの前後に空白が混じっていると、正しく処理できないこともあります。そのような場合、正規表現で前後に空白を含むコンマ(,)も区切り文字として使用できます。
正規表現を使ったsplitメソッドの例 moji = "tokyo, nagoya , osaka" arr = moji.split(/\s*,\s*/) # arr = ["tokyo", "nagoya", "osaka"]
1文字ずつ配列に分割
splitメソッドの分割文字に空白文字(“”)を指定すると、対象の文字列を1文字づつの配列に分割できます。なお、日本語の全角文字を扱うためには、文字コードを設定しておく必要があるので注意してください。
# encoding: utf-8 moji = "こんにちは" arr = moji.split("") # arr = ["こ","ん","に","ち","は"]
splitメソッドの応用的な使い方
これまで解説したように、文字列を配列に変換するsplitメソッドですが、他のプログラム言語のように単体でも使えます。しかし、Rubyらしい書き方をすれば、他のメソッドと組み合わせて、複雑な処理を簡単に書くこともできます。次からは、そういったsplitメソッドを使った応用的な使い方をご紹介します。
複数の区切り文字を使う方法
複数の区切り文字を使って配列に分割したい場合、予めそれらの区切り文字を、別の文字に変換しておき、その別の文字を使ってsplitメソッドを配列に分割します。
複数の区切り文字を使う例 moji = "tokyo,nagoya;osaka" tmp1 = moji.gsub(",","#") tmp2 = tmp1.gsub(";","#") arr = tmp2.split("#") # arr = ["tokyo", "nagoya", "osaka"]
しかし、Rubyのsplitメソッドでは、区切り文字に正規表現が使えます。そして、正規表現を使えば、複数の区切り文字を使用して配列に分割することが可能です。例えば、コンマ(,)とセミコロン(;)の2つを使いたい場合、「/,|;/」といった正規表現を利用します。
正規表現で2つの区切り文字を使うsplitメソッドの例 moji = "tokyo,nagoya;osaka" arr = moji.split(/,|;/) # arr = ["tokyo", "nagoya", "osaka"]
mapメソッドと組み合わせる
splitメソッドが出力するのは配列ですが、Rubyには配列を操作するメソッドが幾つかあります。そして、そのような配列を操作するメソッドの代表がmapメソッドです。mapメソッドは、配列の全ての要素を加工する処理を一行で書けます。
例えば、数字をコンマ区切りで記述した文字列から、要素が数字の配列に変換するには、次のように書きます。
moji = "100 200 300 400" arr = moji.split().map(&:to_i) #arr = [100, 200, 300, 400]
この例では、splitメソッドに、配列の要素を文字列から数字に変換するmapメソッドの「map(&:to_i)」を組み合わせています。
まとめ
これまで紹介してきたように、Rubyのsplitメソッドには、複数の区切り文字が使えたり、正規表現が使えたりと他のプログラム言語の同じ機能に比べて多機能な点が特徴です。さらに、splitメソッドが生成した配列を処理するメソッドを組み合わせれば、複雑な処理を一行で簡単に書ける点もメリットと言えます。
なお、多くのWebプログラマーにRubyが支持されている理由の一つは、複雑な処理でも簡潔なプログラムで書ける点です。しかし、そのためにはオブジェクトを正しく理解していなければ、そういった書き方ができません。今回紹介したsplitメソッドも、オブジェクトを理解していると、いろいろな使い方ができます。ぜひ、オブジェクトへの理解を深めて、Rubyらしいsplitメソッドの使い方をマスターしてください。