正規表現とは
文字列に特定の文字が含まれているかを確認することや、特定の文字を取り除くなどの操作を行うための技術
プログラミング中で正規表現を利用するケース
- 文字列の一部分を置換する
- 文字列が制約を満たしているか調べる
- 文字列の一部分を抽出する
本記事は上記の2.についてです。
モデル内にて特定の文字列の制約を設ける
以下のような例があったとします。
class Impression < ActiveRecord::Base
VALID_YOUTUBE_URL_REGEX = /\A.*youtube.*\z/
validates :url, presence: true, format: { with: VALID_YOUTUBE_URL_REGEX }
end
ここでは、Impressionモデルにおいて、urlカラムに対するバリデーションを実施しています。
正規表現が使用されているのは、以下の部分です。
/\A.*youtube.*\z/
上記のようにすることで、
操作したい文字列に対して、その文字列の先頭・末尾以外に"youtube"という文字列が含まれていればマッチ
という条件を設けることが出来ます。
アンカー
ここでの\A及び\zはアンカーと呼ばれるもので、幅0の文字列にマッチするメタ文字列です。
幅0とは文字と文字の間、文字列の先頭、文字列の末尾、などを意味します。
以下の例があります。
# 文字列中の real にマッチする
/real/.match("surrealist") # => #<MatchData "real">
# 先頭にrealがないとマッチしない
/\Areal/.match("surrealist") # => nil
# 末尾にrealがないとマッチしない
/real\z/.match("surrealist") # => nil
※後述しますが、今回の場合、このアンカーを除去しても(/.youtube./)、同じような結果が得られます。
任意の1文字
\Aの後に.(ドット)があります。
これはメタ文字列で任意の1文字を表します。
量指定子
以下のメタ文字列は繰り返しを表現します。直前の部分式を何回繰り返すかを指定します。このような繰り返しを表すメタ文字列を量指定子(quantifier)と呼びます。
-
- 0回以上
-
- 1回以上
- ? 0回もしくは1回
- {n} ちょうどn回(nは数字)
- {n,} n回以上(nは数字)
- {,m} m回以下(mは数字)
- {n,m} n回以上m回以下(n,mは数字)
今回の場合、直前の部分式である . を * 0回以上繰り返しOKという条件を加えています。
上記より今回の正規表現では
aaaaaaaaaaaaaayoutubeaaaaaaaaaaaaaaaaaa
でも制約をクリアします。
#参考記事
Ruby 2.7.0 リファレンスマニュアル
#最後に
本記事は備忘録として記載しております。
間違いございましたら、指摘いただけますと幸いですm(_ _)m