0
0

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 1 year has passed since last update.

正規表現

Posted at

image.png
1:全角かな/カナ漢字の区別
image.png
①[ぁ-んァ-ヶ一-龥々ー]
 かな/カナ、または漢字についても[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桁の数字 となります。
image.png
①{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回以上続き、末尾までそれが続くことが前提条件となります。
image.png
例:モデルへの記述
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回以上続く文字列にマッチ
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?