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)