LoginSignup
1
0

More than 3 years have passed since last update.

【Ruby】scanメソッドでフォーマットがバラバラの年月日情報を抜き出す

Posted at

はじめに

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"]

どれも同様の出力を得ることが出来ました。

間に入る文字がパターン外であれば無視されるので、文字数の決まっていないシーンで便利です。

あとはこの配列を用いて好きなフォーマットに整形しなおすことが可能になります。

おわりに

記述がシンプルで済むのもいいですね。

他にこういうシーンで真価を発揮する!ということをご存知の方がいらっしゃれば是非教えて頂きたいです:relaxed:

参考にさせて頂いたサイト(いつもありがとうございます)

instance method String#scan (Ruby 2.6.0)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0