むじんブログ ”3歩進んで2歩下がる”

37歳未経験からのエンジニア転職を目指す営業部長

学習アウトプット【正規表現】

日々Twitterで学習のアウトプットを行っていたが、

・内容によっては文字数制限でアウトプットしづらい

・数日分のアウトプットが溜まっている

という理由から、ブログでのアウトプットも併用してみる。

 

正規表現

・文字列に特定の文字が含まれているか確認する

・特定の文字を取り除くなど

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

などを行うこと。

 

電話番号のハイフンを自動で消したり、

メールアドレスやパスワードが半角英数で入力されているか確認するなどの際に用いる。

 

・subメソッド

文字列の特定の部分を別のものに置き換える。

~~~.sub(/○○/, “△△”)

上記は、~~~の中の○○を△△に置き換えるという意味になる。

 

・gsubメソッド

subメソッドでは、複数の条件が当てはまる場合も最初の1文字しか置き換えが出来ない。

対してsubメソッドでは文字列内の全文字を対象に取ることが出来る。

 

・matchメソッド

引数に指定した文字列が、文字の中に含まれるか確認する。

含まれている場合:MatchDataというオブジェクトで指定した文字列が戻り値として返される。

含まれていない場合:nilが戻り値となる。

 

正規表現の用法

正規表現if文で用いる。

(パターンにマッチした場合とそうでない場合で条件分けを行う)

 

-----------------------------------------------------------------------------------

↓↓↓ここから下は参考程度ぐらいで良さそう。

 

pass.match(/[a-z\d]{8,}/i)

a-z:アルファベットのa~zで構成されているか

\ddは数字を表す(d特殊文字で、前に\の記載を要する)

{8,}:少なくとも8回という意味(多くても回のところは空欄なので制限なし)

i:大文字と小文字を区別しないという意味になる(iをつけないと、指定した通りa-zの小文字だけがマッチとなる)

英数字(大文字小文字問わず)の少なくとも8回以上記載されたものがマッチするという意味になる

 

mail.match(/@.+/)

.:ハイフンやピリオドなどを含めて、どの文字でもマッチする(hogeならh)

+:直前の文字が1回以上繰り返している場合に、その文字のみにマッチする(aaabbならaaa

@から始まり、何かしらの文字が1回以上繰り返すものにマッチという意味になる。

こうすることでメールアドレスからドメイン部分のみを抽出することができ、

もしも「@ ~」という文字列ではなかった場合に、メールアドレスとしての登録を認めない、という処理に応用できる。

 

-----------------------------------------------------------------------------------

↓↓↓ここから下はさらに参考の参考程度。

 

irb(main):001:0> postal_code = "150-0044"

irb(main):002:0> postal_code.match(/\A\d{3}[-]\d{4}\z/)

=> #<MatchData "150-0044">

 

\AAの直後に置いた文字が文字列の先頭だった場合にマッチする。

今回の場合、\A\d{3}なので「先頭から数字が3回連続した場合マッチ」となる

\ZZの直前に置いた文字が文字列の最後だった場合にマッチする。

今回の場合、\d{4}\zなので「最後から4文字が数字だった場合にマッチする」となる

 

irb(main):001:0> full_name = "山田はな子"

irb(main):002:0> full_name.match(/\A[ぁ-んァ-ヶ一-龥々ー]+\z/)

=> #<MatchData "山田はな子">

irb(main):003:0> full_name = "田中メアリー"

irb(main):004:0> full_name.match(/\A[ぁ-んァ-ヶ一-龥々ー]+\z/)

=> #<MatchData "田中メアリー">

irb(main):005:0> full_name = "yamadaハナ子"

irb(main):006:0> full_name.match(/\A[ぁ-んァ-ヶ一-龥々ー]+\z/)

=> nil

 

[ぁ-んァ-ヶ一-龥々ー]:かな・カナ・漢字

バリデーションの文字の入力範囲などで用いる

 

irb(main):001:0> password = "T2o0k2y0o"

irb(main):002:0> password.match(/\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i)

=> #<MatchData T2o0k2y0o>

 

?=:この後に続く文字列が入っている場合にマッチとする。

*?:直前に設定した文字が0回以上続く文字列をチェックし、?の直後の文字が出た段階でその1文字を返す

 

「先頭が任意の文字0回以上と英数字ではじまっていて、末尾が英数字の1回以上の連続する文字列にマッチし、大文字小文字の区別がない」となる。