学習アウトプット【正規表現】
日々Twitterで学習のアウトプットを行っていたが、
・内容によっては文字数制限でアウトプットしづらい
・数日分のアウトプットが溜まっている
という理由から、ブログでのアウトプットも併用してみる。
【正規表現】
・文字列に特定の文字が含まれているか確認する
・特定の文字を取り除くなど
・文字列自体が制限を満たしているかを調べる
などを行うこと。
電話番号のハイフンを自動で消したり、
メールアドレスやパスワードが半角英数で入力されているか確認するなどの際に用いる。
・subメソッド
文字列の特定の部分を別のものに置き換える。
~~~.sub(/○○/, “△△”)
上記は、~~~の中の○○を△△に置き換えるという意味になる。
・gsubメソッド
subメソッドでは、複数の条件が当てはまる場合も最初の1文字しか置き換えが出来ない。
対してsubメソッドでは文字列内の全文字を対象に取ることが出来る。
・matchメソッド
引数に指定した文字列が、文字の中に含まれるか確認する。
含まれている場合:MatchDataというオブジェクトで指定した文字列が戻り値として返される。
含まれていない場合:nilが戻り値となる。
・正規表現の用法
正規表現はif文で用いる。
(パターンにマッチした場合とそうでない場合で条件分けを行う)
-----------------------------------------------------------------------------------
↓↓↓ここから下は参考程度ぐらいで良さそう。
pass.match(/[a-z\d]{8,}/i)
a-z:アルファベットのa~zで構成されているか
\d:dは数字を表す(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">
\A:Aの直後に置いた文字が文字列の先頭だった場合にマッチする。
今回の場合、\A\d{3}なので「先頭から数字が3回連続した場合マッチ」となる
\Z:Zの直前に置いた文字が文字列の最後だった場合にマッチする。
今回の場合、\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回以上の連続する文字列にマッチし、大文字小文字の区別がない」となる。