正規表現
正規表現とは、文字列の中から特定のパターンを見つけ出すための構文のこと。
パターンの書き方の詳細は調べてみよう!
正規表現の使い方
正規表現のリテラルは/と/で囲んで使う。
変数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を得れる。
今日はここまでにしとくか。
本記事は下記本の勉強記事です。初学者にとても良い本です。