1:全角かな/カナ漢字の区別
①[ぁ-んァ-ヶ一-龥々ー]
かな/カナ、または漢字についても[a-z]同様に[ぁ-んァ-ン一-龥]と表現することで、「ぁ」から「ん」まで、「ァ」から「ン」まで、「一」から「龥」までの文字でチェックを行います。これらの文字の範囲は、Unicodeにおける範囲であり、上記の範囲が一般的に指定されます。ただし、[ぁ-んァ-ン一-龥]と表現すると、「ヴ、ヵ、ヶ、々」という文字が弾かれてしまいます。なぜなら、utf-8文字コード上で「ヴ」「ヵ」「ヶ」はカタカナ「ン」の後に配列されているためです。そのため「ァ-ヶ」と記載しています。
また「々」はutf-8文字コード上で記号として認識されているため、別途「々」の指定を追加する必要があります。そのため、[ぁ-んァ-ン一-龥]ではなく、[ぁ-んァ-ヶ一-龥々]と表現することで、あらゆる日本語に対応する言葉ができます。
さらに、長音記号が含まれた文字列を区別する場合を考えましょう。例えば「メアリー」や「ジョニー」のような文字列です。このような長音を区別する場合は、[ぁ-んァ-ヶ一-龥々]の末尾に「ー」を追記して、[ぁ-んァ-ヶ一-龥々ー]と記載します。
例:モデルへの記述
with_options presence: true, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: '全角文字を使用してください' } do
validates :first_name
validates :last_name
end
2:郵便番号
郵便番号は、3桁の数字とハイフンと4桁の数字で構成されています。郵便番号を正規表現らしく言い換えると、先頭に3桁の数字、そしてハイフン、末尾に4桁の数字 となります。
①{n}
直前の文字が n 回出現する場合にマッチします。
例えば、a{5}は、「『a』という文字が5回出現するものにマッチする」という意味になります。
今回はハイフンを挟んでd{3}とd{4}なので、ハイフン前は「数字が3回出現するものにマッチする」、ハイフン後は「数字が4回出現するものにマッチする」という意味になります。
②\A
\Aの直後に置いた文字を、文字列の先頭に持つ場合にマッチします。
今回は\A\d{3}としているので、文字列の先頭に3桁の数字があるとマッチします。postal_codeの先頭は150ですので正しくチェックできています。
③\z
\zの直前に置いた文字を、文字列の末尾に持つ場合にマッチします。
今回は\d{4}\zとしているので、文字列の末尾に4桁の数字があるとマッチします。postal_codeの末尾は0044ですので正しくチェックできています。
例:モデルの記述
validates :postal_code, format: { with: /\A\d{3}[-]\d{4}\z/, message: 'を入力してください' }
3:passwordの英数字混合の判断
チェックするのがパスワードであることから、英字もしくは数字が少なくとも0回以上続き、末尾までそれが続くことが前提条件となります。
例:モデルへの記述
PASSWORD_REGEX = /\A(?=.?[a-z])(?=.?[\d])[a-z\d]+\z/i.freeze
validates_format_of :password, with: PASSWORD_REGEX, message: 'には英字と数字の両方を含めて設定してください'
※.freezeは、PASSWORD_REGEXという変数が編集されないようにするメソッドです。正規表現とは関係ありません。
4:正規表現のパターン表記一覧
パターン 意味
[a-z] 角括弧で囲まれた文字のいずれか 1個にマッチ
\d 数字にマッチ
{n, m} 直前の文字が少なくともn回、多くてもm回出現するものにマッチ
{n} 直前の文字がn回出現するものにマッチ
. 改行以外のどの1文字にもマッチ
- 直前の文字の1回以上の繰り返しにマッチ
\A 直後の文字が先頭にある文字列にマッチ
\z 直前の文字が末尾にある文字列にマッチ
[ぁ-んァ-ヶ一-龥々] 角括弧に囲まれたかな、カナ、漢字のいずれかにマッチ(ヴ、ヵ、ヶ、々を含む)
?= 直後に設定した文字が続く文字列にマッチ
*? 直前に設定した文字が0回以上続く文字列にマッチ