◆当サイトで人気のプログラミング教室のおすすめランキングはこちら!
プログラミングは独学では非効率で、時間を無駄にするリスクがあります。効率的なカリキュラムで学べるスクールを受講しましょう。

DMM WEBCAMP【マンツーマンサポート】1ヶ月短期集中でプログラミングを学ぶスクール
1ヶ月通い放題・メンター常駐の教室環境でプログラミングを学びたい方!
TechAcademyオンラインで開講しているプログラミングスクール
オンラインでどこでも学べる!/教室に行くのが忙しい人でも安心!
TECH::CAMP教養としてのITスキルを学べるスクール
Webデザイン/AI(人工知能)/IOS/Androidアプリ制作/VRを学びたい方!
DMM WEBCAMP PRO転職保証付き!エンジニアとして転職したい人におすすめ!
未経験からプロのエンジニアへ3ヶ月で転職する為のスクールです!
1月生募集中!当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のDMM WEBCAMP PROコース。
12月生は満員となっております。1月生募集に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

プログラムで扱うデータには、画像や音声、数値など、様々な種類のものがありますが、扱いやすく応用が利きやすいのは、文字列ではないでしょうか?

特にRubyでは文字列を扱うStringクラスには様々なメソッドが準備されていますので、余計に扱いやすくなっています。

今回は、そんなStringクラスのメソッドのうち、文字列を分割する「splitメソッド」について詳しく解説します。

splitで文字列を分割する

文字列を扱うプログラムの中で、文字列を分割するというのは、それほど多くないかもしれません。

しかし、いざ文字列を分割しようと思うと、汎用的な処理を作るのは難しいものです。

そんな文字列の分割を、RubyのStringクラスでは容易に使えるようになっています。

それが、「splitメソッド」です。

splitの構文

splitメソッドは文字列を分割して、分割した文字列の配列を返してくれるメソッドです。

その構文は、以下のようになっています。

Stringオブジェクト.split(param1 = $;, param2 = 0)
パラメータ 説明 デフォルト値
第1引数 セパレータ文字列 $;
第2引数 分割の最大個数 0

第1引数には、文字列を分割するセパレータにする文字列を指定します。通常の文字列でも、正規表現でも可能です。

第2引数には、分割する最大個数を設定します。0以下であれば、制限なしで、できる限り分割します。

上記を踏まえて、具体的な使い方を説明しましょう。

空白で分割する

空白文字で文字列を分割する場合は、第1引数引数に空白文字(" ")、nilを設定します。

もし、分割個数を設定しないのであれば、引数なしでsplitメソッドを利用しても構いません。

str = " abc de えふじー H あ い  "

p(str.split(" ")) # ...(1)
p(str.split(nil)) # ...(2)
p(str.split()) # ......(3)

(結果)

["abc", "de", "えふじー", "H", "あ い"]
["abc", "de", "えふじー", "H", "あ い"]
["abc", "de", "えふじー", "H", "あ い"]

なお、第1引数のデフォルト値である「$;」は、特殊なグローバル変数で、通常は「nil」が設定されています。そのため、(3)は(2)と同じになりますので、空白文字で分割してくれるわけです。($;を起動時に変更することは可能です。しかし、プログラムの再利用性を考慮すると変更しない方が良いでしょう)

文字コードの設定がキチンとされている前提ですが、(結果)の通り、全角文字でも空白で分割してくれます。ただし、"あ い"の通り、全角の空白文字はただの文字として認識され、分割用のセパレータとして扱われませんので、注意してください。

また、結果の文字列の"abc"と"あ い"の通り、元の文字列の先頭と末尾にあった空白文字は削除されます。

文字で分割する

EXCELやDBを使ったことのある人はご存じかもしれませんが、CSVというテキストファイルでデータベースのデータを扱うファイルがあります。このファイルでは、データの区切りに","が使われています。

また、URLは"/"で区切られています。

他にも、多くの文字列データが空白ではない文字で区切られている場合は多いでしょう。

そんなときも、splitメソッドは有用です。例えば、","区切りの場合は、第1引数に","を渡せば良いのです。

str = " abc, de,fg,h,i  "

p(str.split(","))

(結果)

[" abc", " de", "fg", "h", "i  "]

なお、" "のときと違って、文字列の先頭と末尾の空白は削除されませんので、気を付けなければいけません。また、セパレータの文字の前後に空白があった場合、それもデータの一部と見なされます。つまり、データの前後にある空白文字も削除されないということですので、注意が必要です。

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー

文字列で分割する

splitメソッドは、第1引数に文字列を渡すこともできます。その場合は、もちろん文字列をセパレータとして分割してくれます。

str = " abcsepdesepfgsephsepi  "

p(str.split("sep"))

(結果)

[" abc", "de", "fg", "h", "i  "]

上の例は極端ですが、任意の文字列でもセパレータにできますので、応用範囲は広いのではないでしょうか?

正規表現で分割する

Rubyのsplitメソッド最大の強みと言えるのが、この機能です。

例えば、","の前後に空白が入っていたり入っていなかったりする場合が良くあります。そのような場合は単純に","をセパレータとしてしまうと、分割した文字列データの前後に空白が入ってしまいますので、それを別途削除する処理が必要です。

しかし、固定の文字列や文字ではなく、正規表現にマッチする文字列をセパレータに設定することで、splitメソッドだけで分割を完結できるのです。

str = "abc, de , fg,h, i"

p(str.split(",")) # .........(1)
p(str.split(/\s*,\s*/)) # ...(2)

(結果)

["abc", " de ", " fg", "h", " i"]
["abc", "de", "fg", "h", "i"]

(1)と(2)の結果を比較すれば、一目瞭然ですね。

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】

1文字ずつに

文字列を1文字ずつ抜き出して処理を行う方法は、プログラム言語によっては容易なものもありますが、文字列を文字列として扱っている言語では面倒なものです。

Rubyは、文字列を文字列として扱っているプログラム言語ですが、splitメソッドを使えば簡単に1文字ずつに分割できます。

その方法は簡単で、第1引数に空文字列("")を設定するだけです。

str = " abc de えふじー H あ い  "

p(str.split(""))

(結果)

[" ", "a", "b", "c", " ", "d", "e", " ", "え", "ふ", "じ", "ー", " ", "H", " ", "あ", " ", "い", " ", " "]

なお、結果の通り、空白文字も、全角文字も全角の空白もすべて1文字として分割します

分割数を制限する

ここまでが分割の方法です。

splitメソッドの第1引数に渡す文字列によって、様々な分割を行うことができます。

このとき、第2引数に1以上の数値を渡すことで、分割する数に制限を与えることができます。

分割できる数と第2引数に渡される値による動作は以下のようになっています。

分割できる数と第2引数 動作
分割できる数 < 第2引数 分割できる数の要素に分割
分割できる数 == 第2引数 分割できる数の要素に分割
分割できる数 > 第2引数 第2引数の数-1まで分割処理を行い、残りは1つの要素とする

具体的には、以下のようになります。

str = "abc,defg,hi"

p(str.split(",",5)) # 分割できる数(3) < 第2引数(5)
p(str.split(",",3)) # 分割できる数(3) == 第2引数(3)
p(str.split(",",2)) # 分割できる数(3) > 第2引数(2)

(結果)

["abc", "defg", "hi"]
["abc", "defg", "hi"]
["abc", "defg,hi"]

なお、末尾に空の要素ができるような文字列だった場合も、第2引数に渡される数値によって結果が変わります。

第2引数 動作
指定なし or 0 空の要素は省略される
空の要素を含んだ分割できる数以上、もしくは負の値 空の要素も要素として分割する

こちらも、具体的なプログラムで動きを確認しておきましょう。

str = "abc,defg,hi,,"

p(str.split(","))    # 第2引数なし
p(str.split(",",0))  # 第2引数0
p(str.split(",",-1)) # 第2引数が負
p(str.split(",",6))  # 分割できる数(5) =< 第2引数(6)

(結果)

["abc", "defg", "hi"]
["abc", "defg", "hi"]
["abc", "defg", "hi", "", ""]
["abc", "defg", "hi", "", ""]

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】

問題「たぬきことば」

有名な言葉遊びに、「たぬきことば」があります。

これは、極めて単純な暗号文の解読です。

次の「たぬきことば」について、何が書いてあるのか分かるでしょうか?

「そらたがあたおいたな。たいいたてんたきだた」

置換処理でもできますが、ぜひsplitメソッドを使って、この暗号を解いてみてください。

まとめ

Rubyの文字列分割メソッド「split」の説明をしました。

他のプログラム言語でも、文字列の分割については同じ名称のものがありますので、他のプログラム言語を知っている人は違和感なく使えたことでしょう。

しかし、Rubyのsplitには、他にはない「正規表現」などの優秀な機能がありますので、より使いやすくなっていると思います。

それほど頻繁に使うわけではないメソッドかもしれませんので、もし使い方を忘れてしまったら、この記事を参考にしていただければと思います。

・文字列の分割は、Stringクラスのsplitメソッドで行える
・分割された文字列は、配列に格納されて戻ってくる
・splitメソッドの引数は、セパレータ文字列と、分割の最大個数の2つ
・セパレータ文字列には、文字、文字列、正規表現が使える
・セパレータ文字列に空文字を渡すと、1文字ごとに分割できる
・分割できる数 > 第2引数の場合、分割できなかった最後の文字列は1つの要素になる
・末尾に空の要素も必要であれば、第2引数の設定が必須

問題の答え

str = "そらたがあたおいたな。たいいたてんたきだた"
for s in str.split("た")
  print(s)
end

DMM WEBCAMP ONLINE/プログラミングコースについて

WEBCAMPでは、「どこでも学べる」オンラインコースを開講しています。

初心者・未経験の方でもわずか1ヶ月でプログラミングの基礎を学び、アプリケーション開発をすることができます。

DMM WEBCAMP ONLINEが選ばれる3つの理由

1.学習の仕方がわからなくても安心!初心者に寄り添った学習カリキュラム

これから学習を始める初心者の方や、独学で挫折してしまった方に向けて、アプリケーション作成をゴールとする一気通貫したカリキュラムを提供しています。2500名を輩出しているWebCampだからこその教室でのリアルな受講生の声を反映し、オンラインコースでも初心者に寄り添った学習体験をご提供いたします。

2.つまずいたらすぐ解決!プロのエンジニアに質問し放題

プログラミング学習で挫折する理由の多くは「つまずいた時に聞ける人がいない」ことです。オンラインコースでは、現役エンジニアやプロ講師に、すぐにチャットでの質問が可能です。つまずきをすぐに解消できるので、挫折せずに学習を継続することができます

3.1ヶ月間で終わらなくても大丈夫!カリキュラムは"卒業後"も"無料"で利用可能

受講したいけど、仕事が急に忙しくなるかもしれないから受講するか迷っている・・・そんな方も多いのではないでしょうか?ご安心ください。カリキュラムは期間終了後も「無料」で使うことができます。また、しっかり学習時間を確保した方も、振り返って学習することでプログラミングスキルがご自身に馴染んできます。

▼まずは無料でWEBデザインのカリキュラムを体験しよう!

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

おすすめの記事