はじめに
今回はRubyで正規表現を利用するmatchメソッドの応用を紹介します。
パスワードの文字数に制約を設定する
matchメソッドでを使って、登録するパスワードに「英数字8文字以上かどうか」をチェックしてみます。大文字小文字はどちらも入力可能とします。
まずは例を見てみましょう。
irb(main):001:0> pass = 'Hoge1234'
=> "Hoge1234"
irb(main):002:0> pass.match(/[a-z\d]{8,}/i)
=> #<MatchData "Hoge1234">
パスワードを7文字にするとどうなるでしょうか。
irb(main):001:0> pass = 'Hoge123'
=> "Hoge123"
irb(main):002:0> pass.match(/[a-z\d]{8,}/i)
=> nil
nilが返ってきました。irbの002の記述で8文字以上かどうかが確かめられているのが分かります。
さて、わからないのはmatchの後ろの記述がどういう意味かですね。
一つずつみてみましょう。
先ほどの表現は下記の4つに分けられます。
それぞれに意味があります。
・[a-z]
・\d
・{n, m}
・i
[a-z]
各括弧[]の中文字のうちのどれか一つがマッチするかどうかを確認できます。ハイフンを使うことで範囲的に設定することもできます。[a-z]はアルファベットでaからzまでのどれかにマッチするかどうか、という意味です。
aからcまでの英数字の抽出をしている例を見てみましょう。
irb(main):001:0> 'dog'.match(/[a-c]/)
=> nil
dogにはa,b,cどれもマッチしていないのでnilが返ってきています。
/d
dというのは数字を表しています。これは特殊文字と言われるものの一つです。特殊文字を使うときは、直前に/を記述する決まりがあります。
先ほどの[a-z]と組み合わせて。**[a-z/d]**とすると、英数字の何か一つにマッチするかどうか確かめることができます。
/dを単体で使用する(数字だけを抽出する)例です↓
irb(main):001:0> 'I have 3 pens'.match(/\d/)
=> #<MatchData "3">
{n, m}
n, mに数字を入れて使います。直前の文字が少なくともn回、多くてもm回出現するものにマッチすることを確認します。
これを使えば文字数の制約をかけることができます。
[a-z/d]{,8}という記述は英数字のどれかが少なくとも8回出現するものにマッチという意味です。
数字が少なくとも4回、多くても6回出現するものを確認する例です↓
irb(main):001:0> '12345678'.match(/\d{4,6}/)
=> #<MatchData "123456">
irb(main):002:0> '123'.match(/\d{4,6}/)
=> nil
i
最後にオプションでiを加えることで、大文字と、小文字を区別せずに検索できます。ちなみに、もしiをつけなければ、[a-z]という記述は小文字なので、大文字にはマッチしません。
大文字と小文字の区別をしている例↓
irb(main):003:0> 'Cat'.match(/cat/)
=> nil
irb(main):004:0> 'Cat'.match(/cat/i)
=> #<MatchData "Cat">
最後に
これらの組み合わせでいろんな制約をかけられそうですね。
次回もmatchの応用で、メールアドレスからドメイン部分のみを抽出する方法を紹介します。