はじめに
Rubyでデフォルトで用意されているscan
メソッドを使ってみたら便利だったのでまとめました。
参考にしたのはRuby公式リファレンスです。
instance method String#scan (Ruby 2.6.0)
この記事が役に立つ方
-
scan
メソッドの使い方を知らない - Ruby初心者
この記事のメリット
-
scan
メソッドで欲しい情報だけを抜き出した配列を作ることが出来るようになる
環境
- macOS Catalina バージョン10.15.1
- シェル:zsh
- Ruby 2.6.3
scan
メソッドとは?
公式リファレンスの説明
self に対して pattern を繰り返しマッチし、 マッチした部分文字列の配列を返します。
pattern が正規表現で括弧を含む場合は、 括弧で括られたパターンにマッチした部分文字列の配列の配列を返します。
基本構文
以下のようになります。
文字列.scan(探索するパターン)
探索するパターンには文字列や正規表現が入ります。
では、次に具体的な使用例を確認しましょう。
具体的な使用例
【フォーマットが定まっていない年月日を配列にして取得したい】
例えば、以下のような年月日のデータがあるとします。
人によって表現がまちまちで、あげくの果てにはひらがな表記まであるとします。
前から何番目、、、とかでは抽出出来ません。
2019/11/18
2019-11-18
2019.11.18
2019年11月18日
2019ねん11がつ18にち
ここから共通[年, 月, 日]の配列を取り出したい場合、以下のようにします。
年月日の文字列.scan(/\d+/)
/\d+/
は1文字以上の数字を表す正規表現です。
では、出力をみてみましょう。
【出力】
"2019.11.17".scan(/\d+/)
=> ["2019", "11", "17"]
"2019/11/17".scan(/\d+/)
=> ["2019", "11", "17"]
"2019-11-17".scan(/\d+/)
=> ["2019", "11", "17"]
"2019年11月17日".scan(/\d+/)
=> ["2019", "11", "17"]
"2019ねん11がつ17にち".scan(/\d+/)
=> ["2019", "11", "17"]
どれも同様の出力を得ることが出来ました。
間に入る文字がパターン外であれば無視されるので、文字数の決まっていないシーンで便利です。
あとはこの配列を用いて好きなフォーマットに整形しなおすことが可能になります。
おわりに
記述がシンプルで済むのもいいですね。
他にこういうシーンで真価を発揮する!ということをご存知の方がいらっしゃれば是非教えて頂きたいです