こんにちは!
僕は今、プログラミングスクールの
最終課題をやっています。
仕事をしながらスクールに通って3ヶ月が
経とうとしています。
「100%理解してからカリキュラムを進めるんじゃなくて、
とりあえず60%ぐらいの理解で
わからない、覚えてないと思った時に振り返ればいい。」
と思って進めてきました。
最終課題では自分で1からWebアプリケーションを作成するのですが、
覚えてないことだらけで震えました。
この記事ではユーザー登録機能の実装で
正規表現で震えまくったので復習も兼ねて
アウトプットしていきたいと思います。
正規表現
Webアプリケーションにおいて
メールアドレスに「@」を入れなきゃいけなかったり、
パスワードを半角英数字に指定できたりするアレです。
これらは正規表現を用いて記述します。
文字列に特定の文字が存在するか確認したり、
特定の文字を取り除いたりする操作を
行うのが正規表現を用いたテクニックです。
パスワードを英数字で記述
正規表現のお勉強は以前していましたが、
カリキュラムを進めることだけを考えていた当時の僕は
「ハイハイ、そんなのがあるんだねハナホジー」
程度で見てました。
こんなマインドで最終課題に来ちゃったもんだから
復習をしている時にもう汗が止まりませんでした。
カリキュラムをこなす、最終課題を早く終わらせるとか
こんなマインドじゃお客様思考のポンコツエンジニアにしか
なれないので心を改めます。
さて、パスワードを英数字で記述するバリデーションの設定は
以下の通りです。
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
直前の文字が末尾にある文字列にマッチします。
名前を全角かな/カナ漢字で登録
with_options presence: true, format: { with: /\A[ぁ-んァ-ヶー-龥々ー]+\z/ } do
validates :first_name
validates :last_name
end
こんな感じで実装しました。
[ぁ-んァ-ヶー-龥々ー]
最初なんかのバグを習わなきゃいけないのかと思いました。
[]を使用することで、[]に囲まれた文字のうち1つがマッチするんでしたよね。
中身はぁ-んァ-ヶー-龥々ー。
ナンジャこりゃ。
一個ずつ見ていきましょーや。
「ぁ-ん」は「ぁ」から「ん」までということは想像できますよね。
「ァ-ン」と表現すると「ヴ、ヵ、ヶ」という文字が弾かれちゃうので
「ァ-ヶ」と表現しています。
「一-龥」と記述することで漢字をチェックすることができます。
「々」は文字ではなく、記号として認識されちゃうので
別途「々」の指定を追加する必要があります。
また末尾に「ー」をつけることで、
「サラー」や「ケレハー」のような長音記号が含まれた文字列を
区別することができます。
名前のフリガナを登録する場合
カタカナのみの登録の際は[ァ-ヶー-]
のみにしてしまいましょう!!
with_options presence: true, format: { with: /\A[ァ-ヶー-]+\z/ } do
validates :first_name_kana
validates :last_name_kana
end