【10日目:正規表現ってそういう意味やったんや。。。】改訂3版基礎Ruby on Railsを読んだで!

シェアする

  • このエントリーをはてなブックマークに追加
41AkxXsz+5L._SX258_BO1,204,203,200_

正規表現

正規表現とは、文字列の中から特定のパターンを見つけ出すための構文のこと。

パターンの書き方の詳細は調べてみよう!

正規表現の使い方

正規表現のリテラルは/と/で囲んで使う。

変数reはRegexpクラスのオブジェクト

re = /cat/

パターンを使って文字列をチェックするには、=~演算子を使う。

文字列の中にパターンが見つかることを「マッチする」という。
※マッチしないことを調べる=!演算子もある。

例:文字列の中にcatというパターンがあるかどうかを調べるもの

str = "concatenate"
if str =~ /cat/
  puts "catあったよ"
end

また、Stringクラスのmatchメソッドを使うこともできる。

matchメソッドが返すのはMatchDataクラスのオブジェクト(マッチしない場合はnilを返す)

このオブジェクトを使うとパターン内で()で囲んだ部分の記録を取り出せます。

例:md[0]でマッチした部分を、md[1]で最初の括弧とマッチした部分、md[2]で2番目のカッコとマッチした部分を表示

※\S+は空白以外で長さ1以上の文字列にマッチする。

str = "The quick brown fox jumps over the lazy dog"
md = str.match(/(\S+) fox .+ (\S+) dog/)
if md
  puts "#{md[0]}とマッチしました"
  puts "最初のかっこは#{md[1]}とマッチ"
  puts "次のかっこは#{md[2]}とマッチ"
end

matchメソッドの仕様で全体括弧が0、全体括弧の中の1つ目が1、2つ目が2

空白や、.+にも意味がある。→文章に空白があるから。

組み込みのグローバル変数$&、$1、&2・・・・・でマッチした部分を取り出すことも可能。

$&は上記のmd[0]、$1はmd[1]、&2はmd[2]に対応する。

正規表現のオプション

Rubyの正規表現には次のオプションを指定できる。

オプション 意味
i 大文字小文字を区別しない
o 一度だけ式展開を使う。同じパターンを何回も使うときはこのオプションで高速化できる。
x 空白を無視する。また、#から改行までをコメントとみなす。
m 複数行モード。「.」は改行にもマッチする

オプションを指定して正規表現のパターンをつくるとこいは、/~/の次にオプションを並べる

例:大文字小文字を区別せずcat、CAT、Catにマッチする

re = /cat/i

パターンによる置換

文字列中のパターンを置換するには、Stringクラスのgsubメソッドをつかう。

gsubは第一引数のパターンを全て第二引数の文字列で置換して、新しい文字列を返す。

例:「cat」または「dog」というパターンを「pig」に置換する。

str = "a white cat and a black dog"
str2 = str.gsub(/cat|dog/, "pig")
puts str2

gsubメソッドにはブロックを渡してループの中で一致した部分を処理するということもできる。

ブロックの戻り値が置換後の文字列になる。

例:「cat」または「dog」というパターンを置換するが、「cat」の場合は「mouse」、そうでなければ[monkey]に置換

str = "a white cat and a black dog"
str.gsub!(/cat|dog/) do |name|
  name == "cat" ? "mouse" : "monkey"
end
puts str

ポイントはgsubの!付きメソッドを使用していること。

!付きメソッドなので内容を変更する。gsub!メソッドは新しい文字列を返さず、その文字列自体の内容を変更している。

%r{~}という記法

/~/ノ代わりに%rを使うと文字の列のリテラル%qのようにスラッシュ以外の文字列でパターンを表記できる

こんなこともできる

url =~ %r{^http://}

日付と時刻

Railsアプリケーションでは日付や時刻を頻繁に使う

RubyではTimeクラスのオブジェクトを使う。

現在の日付と時刻を表すTimeオブジェクトを創るにはクラスメソッドnowをつかう。

time = Time.now
puts time.month # 月を表示

Timeオブジェクトから年月日時分秒を取り出すには、それぞれ

year,month,day,hour,min,secというメソッドをつかう。

曜日はwday※日曜が0

特定の日付と時刻を創るにはlocalメソッドに年月日時分秒を順に渡す。

第二引数以降は省略できる。月日時分秒を省略すると1月1日0時0分0秒となる。

time = Time.local(2015,12,31,23,59,59)

日付と時刻を好きな形式の文字列にするには、strftimeメソッドを使う。

引数の文字列に「%文字」を埋め込むと、そこが日付と時刻のパーツに置き換わる。

例:「年/月/日 時:分」という形式で現在の時刻を表示する。

time = Time.now
puts time.strftime("%Y/%m/%d %H:%M")

strftimeメソッドで使えるおもな書式は以下

オプション 意味
%d 英語の曜日の略名※Sun、Monなど
%A 英語の曜日名※Sunday,Monday
%b 英語の月の略名※Jan,Feb
%B 英語の月明※January、February
%d
%H 時(24時間表記)
%I 時(12時間表記)
%m 月(1月は01、2月は02)
%M
%p 午前、午後(AMまたはPM)
%S
%y 2桁の年
%Y 4桁の年
%Z タイムゾーン名
%% %の文字

モデルクラスでの日付と時刻

Railsのモデルの属性では日付型や日付+時刻型のデータも扱える。

日付型のデータは、Dataクラスのオブジェクト。

DataクラスはRubyの標準ライブラリに含まれるもので、時刻抜きの日付だけを表します。

日付+時刻型のデータは、ActiveSupport::TimeWithZoneクラスのオブジェクとになる。

このクラスはRailsのタイムゾーン情報と結びついた日付時刻を扱うものでTimeクラスと同じメソッドを備えている。

なおRailsではTime.nowの代わりにTime.currentを使うと現在時刻を表すActiveSupport::TimeWithZoneを得れる。

今日はここまでにしとくか。

本記事は下記本の勉強記事です。初学者にとても良い本です。

スポンサーリンク
Sponsored Link
Sponsored Link

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
Sponsored Link