TECH EXPERT 24日目 正規表現
正規表現とはなんぞや
正規表現とは、文字列の一部分を抽出・置換したり、文字列が制約を満たしているかを調べるための表現方法です。
使用例 ユーザーA 電話番号にハイフン入力
ハイフンを取り除く処理をする技術→ 正規表現
メソッド
sub
sub:文字列の指定した部分を別の文字列に置き換えるためのメソッド。
第1引数に置き換えたい文字列を指定し、第2引数に変換後の文字列を指定。
操作したい文字列は/で囲む。gsubと違い初めの1つだけ置換する。
(例)電話番号のハイフン
irb(main):002:0> tel.sub(/-/,'')
=> "0901234-5678"
# 最初のハイフンしか置換されない
gsub
文字列内で指定した文字が複数含まれている場合、その全てを置換するという意味になります。
(例)電話番号のハイフン
irb(main):003:0> tel.gsub(/-/,'')
=> "09012345678"
match
match:引数に指定した文字列がレシーバの文字列に含まれているか否かをチェックするメソッド。含まれている場合は、指定した文字列がMatchDataオブジェクトの返り値で得られます。また、含まれていない場合は、返り値としてnilが出る。
パスワード
pass.match(/[a-z\d]{8,}/i)
=> #<MatchData "Huge1234">
※[a-z]はアルファベットのaからzまでのいずれかにマッチ
※[a-z\d]は英数字のいずれか1つにマッチ dは数字 特殊記号なので \ がいる。
※{n, m}は直前の文字が少なくとも n 回、多くても m 回出現するものにマッチすることを確認する。文字数の制約を追加できる。 今回は直前の文字が少なくとも8回出現するという意味
※ i 最後にiオプションを加えることで大文字・小文字を区別せずに検索
メールアドレス
irb(main):002:0> mail.match(/@.+/)
=> #<MatchData "@tech-camp.com">
※ . 全ての何かしらの文字にマッチ
+ 直前の文字が1回以上の繰り返しでマッチ
※ .+ は「何かしらの文字が1回以上繰り返すもの」にマッチ
先頭に@で、「@から始まり、何かしらの文字が1回以上繰り返すもの」にマッチ
subが置換、matchが抽出・制約調査
正規表現のパターン
パターン 意味
[a-z] 角括弧で囲まれた文字のいずれか 1個にマッチ
\d 数字にマッチ
{n, m} 直前の文字が少なくともn回、多くてもm回出現するものにマッチ
. どの1文字にもマッチ
+ 直前の文字の1回以上の繰り返しにマッチ
\A 直後の文字が先頭にある文字列にマッチ
\z 直後の文字が末尾にある文字列にマッチ
[ぁ-んァ-ン一-龥] 角括弧に囲まれたかな、カナ、漢字いずれかにマッチ
?= 直後に設定した文字が続く文字列にマッチ
*? 直前に設定した文字が0回以上続く文字列をチェックし、?の直後 の文字が出た段階でその1文字を返す
正規表現をバリデーションに応用
郵便番号
→ 先頭に少なくとも3回の数字、そしてハイフン、末尾に少なくとも4回の数字
postal_code.match(/\A\d{3}[-]\d{4}\z/)
全角かな/カナ、もしくは漢字を区別
full_name.match(/\A[ぁ-んァ-ン一-龥]+\z/)
=> #<MatchData "山田はな子">
英数字が混合したパスワードを区別
password.match(/\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i)