こんにちは! フリーエンジニアの長瀬です。
みなさんはsliceを使っていますか?
sliceを使えば配列、文字列、そしてハッシュから直感的に情報を取り出すことができます。
また,文字列の場合は正規表現との相性もいいので、正規表現についても学ぶ必要があります。
それでは行ってみましょう。
この記事では、rubyのsliceについて
・ 配列の番号(インデックス)を指定する
・ 配列の最後の要素から配列の番号(インデックス)を指定する
・ 配列の番号(インデックス)の範囲を指定する
・ 文字に振られた番号(インデックス)を指定する
・ 文字を範囲で取り出す
という基本的な内容から、
・ 文字を正規表現を使って取り出す
・ matchで部分的に文字列を取り出す
・ハッシュでslice
といった応用的な内容についても解説していきます。
配列でslice
配列の番号(インデックス)を指定する
まずは配列でsliceを使う方法について説明します。
要素の取り出しにはsliceと、そのエイリアス(名前は違うけど機能は同じ)の[]が使えます。
いくつ使用例を紹介します。
array = ["Ruby","Python","Java"] p array[0] p array.slice(0)
[実行結果]
"Ruby" "Ruby"
このように、要素に配列のインデックス番号を指定することで配列の要素を取り出すことができます。
また、[]でもsliceでも同じ結果が返っていきていることがわかります。
配列の要素は0から始まりますので、”Ruby”が取り出されます。
配列の最後の要素から配列の番号(インデックス)を指定する
逆にマイナスを使って、配列の最後の要素から取り出すこともできます。
array = ["Ruby","Python","Java"] p array[-1] p array.slice(-1)
[実行結果]
"Java" "Java"
-1は最後の要素を表すので、”Java”が取り出されています。
配列の番号(インデックス)の範囲を指定する
次は範囲を指定して取り出す方法です。
array = ["Ruby","Python","Java"] p array[0,2] p array.slice(0,2) p array[0..3] p array.slice(0..3)
[実行結果]
["Ruby","Python"] ["Ruby","Python"] ["Ruby","Python","Java"] ["Ruby","Python","Java"]
また、このように範囲を指定して配列の要素を取り出すこともできます。
..はRangeオブジェクトと呼ばれるもので、rubyにおいて範囲を表現します。
Rangeオブジェクトについてはこちらを参考にしてください。
文字列でslice
文字に振られた番号(インデックス)を指定する
文字列でもsliceや[]を使って、一つ一つの文字を取り出すことができます。
配列の場合は、配列の要素でしたが、文字列の場合は一文字一文字に番号が振られます。
p "ruby".slice(0) p "ruby"[0]
[実行結果]
"r" "r"
文字を範囲で取り出す
また、配列同様に、Rangeオブジェクトによる範囲指定もできます。
p "ruby".slice(0,3) p "ruby".slice(0..3) p "ruby"[0,3] p "ruby"[0..3]
[実行結果]
"rub" "ruby" "rub" "ruby"
文字を正規表現を使って取り出す
sliceの引数には正規表現や文字列を渡すこともできます。
p "ruby".slice(/^r.*/) p "python".slice(/\^r.*/) p "ruby".slice("by")
[実行結果]
"ruby" nil "by"
正規表現や文字列を渡すと、それにマッチした値が抽出されます。
該当する文字列がなかった場合はnilが返ってきます。
正規表現に関しては、しっかりと理解していないと扱えないので、こちらの記事を参考に自分でコードを打ち込んでみてくたさい。(正規表現は特殊記号のオンパレードなので、実際に書いてみることをおすすめします。)
matchで部分的に文字列を取り出す
matchメソッドを使えばマッチングさせた文字をもう一度使って、文字列を作成できます。
実際にサンプルコードをみるのが一番わかりやすいです。
matched_string = "rubypythonjava".match(/ruby(p.+)java/) p matched_string[0] p matched_string[1]
[実行結果]
"rubypythonjava" "python"
このように(p.+)で囲まれた部分がmatched_stringの要素になります。
また、一番始めの要素は常に元の文字列になっています。
これは大事なことですが、()での部分的指定は複数使用可能です。
matched_string = "samurai_value = 1024".match(/(s.*)\s=\s(\d{0,12})/) p matched_string[0] p matched_string[1] p matched_string[2]
[実行結果]
"samurai_value = 1024" "samurai_value" "1024"
このように、部分的に文字列を取得してその後、取得した文字列を組み合わせて新しい文字列を作成する場合などにmatchメソッドを使うことができます。
ハッシュでslice
ハッシュでも、ActiveSupportという外部ライブラリーを使うと、sliceメソッドが使えるように拡張できます。
キーをシンボルで指定するだけで、自分が取り出したい部分だけを簡単に選び出すことができます。
require 'active_support' hash = {"Ruby":"Rails","Python":"Django","PHP":"CakePHP"} p hash.slice(:Ruby,:Python) p hash.slice(:Ruby,:PHP)
[実行結果]
{:Ruby=>"Rails", :Python=>"Django"} {:Ruby=>"Rails", :PHP=>"CakePHP"}
ちゃんと指定した要素だけ取り出せますね。
また、逆に特定のハッシュの要素を削除したい場合は以下のようにexceptメソッドを使います。
require 'active_support' hash = {"Ruby":"Rails","Python":"Django","PHP":"CakePHP"} p hash.except(:Ruby,)
[実行結果]
{:Python=>"Django", :PHP=>"CakePHP"}
ちゃんと指定した:Rubyに該当する要素以外が取り出されていますね。
まとめ
いかがでしたでしょうか?
この記事では、rubyのsliceを解説しました。
sliceではとても柔軟に要素を指定できることを学びましたね。
配列、文字列、ハッシュでsliceメソッドを使うことができるので、今回勉強した内容が使える場面に遭遇した時は自信を持って使いましょう。
また、文字列では正規表現と組み合わせることで自由に文字を取り出すことができましたね。
rubyの文字列にはsliceの他にも便利なメソッドがたくさんあるので、これを機に勉強してみてはいかかでしょうか。
もしsliceについて忘れてしまったらこの記事を確認してくださいね!
Rubyの文字列をしっかり理解したい方に
この記事は文字列を体系的に解説した3ステップで簡単! Rubyの文字列を 完全理解の一部となります。
文字列をさらに理解したい方はこちらを読んでどんどん理解を深めていくようにしましょう。