1
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 3 years have passed since last update.

正規表現で泣きました

Posted at

こんにちは!
僕は今、プログラミングスクールの
最終課題をやっています。
仕事をしながらスクールに通って3ヶ月が
経とうとしています。
「100%理解してからカリキュラムを進めるんじゃなくて、
とりあえず60%ぐらいの理解で
わからない、覚えてないと思った時に振り返ればいい。」
と思って進めてきました。

最終課題では自分で1からWebアプリケーションを作成するのですが、
覚えてないことだらけで震えました。

この記事ではユーザー登録機能の実装で
正規表現で震えまくったので復習も兼ねて
アウトプットしていきたいと思います。

正規表現

Webアプリケーションにおいて
メールアドレスに「@」を入れなきゃいけなかったり、
パスワードを半角英数字に指定できたりするアレです。

スクリーンショット 2021-06-26 8.01.34.png

これらは正規表現を用いて記述します。
文字列に特定の文字が存在するか確認したり、
特定の文字を取り除いたりする操作を
行うのが正規表現を用いたテクニックです。

パスワードを英数字で記述

正規表現のお勉強は以前していましたが、
カリキュラムを進めることだけを考えていた当時の僕は
「ハイハイ、そんなのがあるんだねハナホジー」
程度で見てました。
こんなマインドで最終課題に来ちゃったもんだから
復習をしている時にもう汗が止まりませんでした。

カリキュラムをこなす、最終課題を早く終わらせるとか
こんなマインドじゃお客様思考のポンコツエンジニアにしか
なれないので心を改めます。

さて、パスワードを英数字で記述するバリデーションの設定は
以下の通りです。

user.rb
PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze
validates_format_of :password, with: PASSWORD_REGEX

最初見たときはわけわからん過ぎて3日間泣いてました。
涙は出てなかったけど。

細かく見ていきましょう。

[a-z]

これは[]を使用することで、[]に囲まれた文字のうち1つがマッチするかを
チェックしています。
中身はa-zと記述してあるのでアルファベットa~zのうちいずれかに
マッチという意味になります。

 \d

このdは数字を表します。
[a-z\d]は英数字のいずれか1つにマッチという意味になります

?=

?=の直後に設定した文字でチェックをかけて、
設定した文字が続く文字列が存在する場合、
その文字列にマッチします。

 *?

直前の1文字が0回以上続くとマッチします。
このアスタリスクの後に?をつけることで、チェックした文字列の中で、
?の直後の文字が出てきた段階でその1文字のみ返します。

i

最後にiオプションをつけると大文字・小文字関係なく検索してくれます。
逆に小文字のみという制約にする場合は、
iオプションを付けないことで対応できます。

\A

直後の文字が先頭にある文字列にマッチします。

\z

直前の文字が末尾にある文字列にマッチします。

名前を全角かな/カナ漢字で登録

user.rb
with_options presence: true, format: { with: /\A[ぁ-んァ-ヶー-龥々ー]+\z/ } do
    validates :first_name
    validates :last_name
end

こんな感じで実装しました。

[ぁ-んァ-ヶー-龥々ー]

最初なんかのバグを習わなきゃいけないのかと思いました。
[]を使用することで、[]に囲まれた文字のうち1つがマッチするんでしたよね。
中身はぁ-んァ-ヶー-龥々ー。
ナンジャこりゃ。
一個ずつ見ていきましょーや。
「ぁ-ん」は「ぁ」から「ん」までということは想像できますよね。
「ァ-ン」と表現すると「ヴ、ヵ、ヶ」という文字が弾かれちゃうので
「ァ-ヶ」と表現しています。
「一-龥」と記述することで漢字をチェックすることができます。
「々」は文字ではなく、記号として認識されちゃうので
別途「々」の指定を追加する必要があります。

また末尾に「ー」をつけることで、
「サラー」や「ケレハー」のような長音記号が含まれた文字列を
区別することができます。

名前のフリガナを登録する場合

スクリーンショット 2021-06-26 8.54.23.png

カタカナのみの登録の際は[ァ-ヶー-]
のみにしてしまいましょう!!

with_options presence: true, format: { with: /\A[ァ-ヶー-]+\z/ } do
    validates :first_name_kana
    validates :last_name_kana
end
1
0
2

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
1
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?