初心者からのエンジニア日記

2020年6月末~TECH::CAMPにて本格的にプログラミング学習を開始。 販売職/店長を経て、駆け出しエンジニアの道へ一歩踏み出しました! 様々なアウトプットをしていきたいと思います! HTML/CSS,Ruby,Ruby on Rails,Java Script,jQuery,Haml/Scss,GitHub...

【Ruby】正規表現

本日は正規表現についてまとめました!

 

 

正規表現とは

文字列に特定の文字が含まれているかを確認する事や、

特定の文字を取り除く等の操作を行うための技術のこと。

例えば「入力された電話番号のハイフンを取り除く」や

「パスワードに英数字○文字以上」の制約を設定する時に使います。

 

特徴

・文字列の一部分を置換

 例えば、電話番号のハイフンをから文字に置換することで

 異なるフォーマットの文字列を同一フォーマットに変換できる!

・文字列が制約を満たしているか調べる

 ユーザ登録の際に設定するパスワードにおいて8文字以上という

 制約をつけたい時にも正規表現を用いて実装できる!

・文字列の一部分を抽出する

 入力されたメールアドレスからドメイン部分のみ抽出したい時等に使用!

 

正規表現を実現する2つのメソッド

・subメソッド

 文字列の指定した部分を別の文字列に置き換える。

 第一引数に置き換えたい文字列、

 第二引数に変換後の文字列を指定。

 操作したい文字列は「/」で囲む。

 ※JSでは同じ機能を持つメソッドしてreplaceメソッドがある。

・matchメソッド

 引数に指定した文字列がレシーバの文字列に含まれているか否かを

 チェックするためのメソッド。

 含まれている→指定した文字列がMatchDataオブジェクトの

        返り値として得られる。 #<MatchData "〇〇">

 含まれていない→返り値としてnilが得られる。

 

MatchDataオブジェクト

マッチした文字列等はMatchDataオブジェクトで返される。

MatchDataオブジェクトから文字列等を取り出す時、

配列からデータを取り出す時と同様に取り出せる。

irb(main):001:0> str = "Hello, World"
=> "Hello, World"

irb(main):002:0> md = str.match(/Hello/)
=> #<MatchData "Hello">

irb(main):003:0> md[0]
=> "Hello"

 

 

電話番号のハイフンを取り除く

特定の文字列を取り除く、つまり「特定の文字をから文字に置換する」

という考え方。

subメソッドでは最初のハイフンしか置換されないので。

gsubメソッドを使う。

irb(main):001:0> tel = '090-1234-5678'
=> "090-1234-5678"

irb(main):002:0> tel.sub(/-/,'')
=> "0901234-5678"
# 最初のハイフンしか置換されない

irb(main):003:0> tel.gsub(/-/,'')
=> "09012345678"

※gsubのgはグローバルマッチの「g

 文字列内で指定した文字が複数含まれている場合、

 「その全てを置換する」という意味になる。

 

 

パスワードに英数字8文字以上という制約を設定

irb(main):001:0> pass = 'Hoge1234'
=> "Hoge1234"

irb(main):002:0> pass.match(/[a-z\d]{8,}/i)
=> #<MatchData "Hoge1234">

[a-z]‥‥‥角カッコに囲まれた文字のいずれか1個にマッチ

\d‥‥‥数字にマッチ

{ n,  m }‥‥‥直前の文字が少なくともn回、多くてもm回出現するものにマッチ

i‥‥‥大文字・小文字を区別しない検索

 

実践的な利用例

pass = 'Hoge1234'
if pass.match(/[a-z\d]{8,}/i)
  //パスワード設定の処理
else
   puts 'パスワードの形式が間違っています。'
end

 

 

メールアドレスからドメイン部分のみ抽出

irb(main):001:0> mail = 'hoge@hoge.com'
=> "hoge@hoge.com"

irb(main):002:0> mail.match(/@.+/)
=> #<MatchData "@hoge.com">

.  ‥‥‥どの1文字にもマッチ

+‥‥‥直前の文字の1回以上の繰り返しにマッチ

 

.+」は何かしらの文字が1回以上繰り返すものにマッチする

@.+」で「@から始まり何かしらの文字が1回以上繰り返すものにマッチ」

という意味になる。

よってメールアドレスからドメイン部分のみを抽出できる。

 

メールアドレスにバリデーションをかける時の記述例

validates :email, uniqueness: {case_sensitive: false}, format: {with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i , message:"メールアドレスを正しく入力してください"}