7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Ruby]バリデーションで正規表現を使う

Posted at
1 / 2

正規表現とは

文字列に特定の文字が含まれているかを確認することや、特定の文字を取り除くなどの操作を行うための技術

プログラミング中で正規表現を利用するケース

  1. 文字列の一部分を置換する
  2. 文字列が制約を満たしているか調べる
  3. 文字列の一部分を抽出する

本記事は上記の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
でも制約をクリアします。

alt
上記サイトへのリンク

因みにアンカー(\Aと\z)を外した場合は以下の通りです。
alt

参考記事

Ruby 2.7.0 リファレンスマニュアル

最後に

本記事は備忘録として記載しております。
間違いございましたら、指摘いただけますと幸いですm(_ _)m

7
6
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
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?