はじめに
バリデーションに用いる正規表現をまとめる。
正規表現
パターン | 意味 |
---|---|
[a-z] | 角括弧で囲まれた文字のいずれか 1個にマッチ |
\d | 数字にマッチ |
{n, m} | 直前の文字が少なくともn回、多くてもm回出現するものにマッチ |
{n} | 直前の文字がn回出現するものにマッチ |
. | 改行以外のどの1文字にもマッチ |
+ | 直前の文字の1回以上の繰り返しにマッチ |
\A | 直後の文字が先頭にある文字列にマッチ |
\z | 直前の文字が末尾にある文字列にマッチ |
[ぁ-んァ-ヶ一-龥々] | 角括弧に囲まれたかな、カナ、漢字のいずれかにマッチ(ヴ、ヵ、ヶ、々を含む) |
?= | 直後に設定した文字が続く文字列にマッチ |
*? | 直前に設定した文字が0回以上続く文字列をチェックし、?の直後の文字が出た段階でその1文字を返す |
\ | エスケープ文字といい、「正規表現において特別な意味を持つ文字」の直前に入れることで、「正規表現において特別な意味を持つ文字」をただの文字列として扱うことができる文字 |
<正規表現と意味(一例)>
-
/\A[ぁ-んァ-ヶ一-龥々ー]+\z/
1字以上の全角ひらがな、全角カタカナ、漢字にマッチ -
/\A[ァ-ヶー]+\z/
1字以上の全角カタカナにマッチ -
/\A[a-z0-9]+\z/i
1字以上の半角英数にマッチ(大文字小文字問わない)
具体的なバリデーションの記述例
-
with_options
with_optionsは複数のバリデーションをグループ化し、共通の制限をかけるためのメソッドです。
さらに、formatヘルパーを使用することで、正規表現を用いた条件を設定することができます。 -
formatフォーマット
formatは、withオプションに指定された正規表現と属性の値がマッチするかどうかをチェックします。マッチしない場合は、messageオプションに指定された文字列をエラーメッセージとします。 -
numericality
numericalityとは、指定されたカラムに対して数値かどうかを検証するヘルパーです。
また、オプションでonly_integer: trueを指定すると、「整数のみ」という制限を加えることができます。<記述例> with_options presence: true do # ひらがな、カタカナ、漢字のみ許可する validates :name, format: {with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: "is invalid. Input full-width characters."} # カタカナのみ許可する validates :name_reading, format: {with: /\A[ァ-ヶー]+\z/, message: "is invalid. Input full-width katakana characters."} # 半角英字数字のみ許可する validates :nickname, format: {with: /\A[a-z0-9]+\z/i, message: "is invalid. Input half-width characters."} end # 数字3桁、ハイフン、数字4桁の並びのみ許可する validates :postal_code, presence: true, format: {with: /\A[0-9]{3}-[0-9]{4}\z/, message: "is invalid. Include hyphen(-)"} # 0以外の整数を許可する validates :prefecture, numericality: {other_than: 0, message: "can't be blank"} # 1以上、1000000以下の整数を許可する validates :price, presence: true, numericality: {only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 1000000, message: "is invalid"}
-
passwordの英数字混合の判断
#モデルにて PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze validates_format_of :password, with: PASSWORD_REGEX, message: 'には英字と数字の両方を含めて設定してください'
-
全角かな/カナ漢字のあらゆる日本語に対応
with_options presence: true, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: '全角文字を使用してください' } do validates :first_name validates :last_name end
-
¥300〜¥9,999,999までの整数値に限定する
validates :price, format: { with: /\A[0-9]+\z/ }, numericality: { only_integer: true, greater_than_or_equal_to: 300, less_than_or_equal_to: 9999999 }
numericalityで整数のみにする設定や数値の最大値、最小値を設定できる。
only_integer: trueで整数値のみに設定。
greater_than_or_equal_to: 300, less_than_or_equal_to: 9999999}で最小値、最大値を設定。