■プログラミング学習
◎passwordの英数字混合の判断
英数字混合チェックになります。
英数字が混合したパスワードであるか確認をする際には、
英字もしくは数字が少なくとも0回以上続き、
末尾までそれが続くことが前提条件となります。
/\A(?=.?[a-z])(?=.?[\d])[a-z\d]+\z/i
◎「?=」
「?=」の直後に設定した文字でcheckをかけ、設定した文字が続く文字列が存在する場合、その文字列にマッチします。
[1] pry(main)> name = "スティーブ・ジョブズ" => "スティーブ・ジョブズ" [2] pry(main)> name.match(/スティーブ・(?=ジョブズ)/) => #<MatchData "スティーブ・"> [3] pry(main)> name = "スティーブ・ブシェミ" => "スティーブ・ブシェミ" [4] pry(main)> name.match(/スティーブ・(?=ジョブズ)/) => nil
直前が同じ「スティーブ・」から始まる文字列でも、後ろに続く文字が違うと結果が変わります。
今回の場合は、ジョブズが後ろに続く場合のみマッチするように設定したため、
2度めのcheckにはマッチせず、nilが返ってきています。
◎「*?」
「」は、直前の1文字が0回以上続くとマッチします。
下記のように、「(design)」とした場合は、「design」や、「(de)」とした場合、
「de」がマッチします。
この「」のあとに「?」をつけることで、checkした文字の中で「?」の直後の文字が出てきた段階でその1文字のみ返します。
[7] pry(main)> name.match(/design*/) => #<MatchData "design"> [8] pry(main)> name.match(/de*/) => #<MatchData "de"> [10] pry(main)> name = "deeeeee" => "deeeeee" [11] pry(main)> name.match(/de*/) => #<MatchData "deeeeee">
◎正規表現のパターン表記一覧
- [a-z] | 角カッコで囲まれた文字のいずれか1個にマッチ
- \d | 数字にマッチ
- {n,m} | 直前の文字が少なくともn回、多くともm回出現するものにマッチ
- . | 改行以外どの1文字にもマッチ
- | 直前の文字が1回以上の繰り返しにマッチ
- | 直前の文字が1回以上の繰り返しにマッチ
- \A | 直後の文字が先頭にある文字列にマッチ
- \z | 直前の文字が末尾にある文字列にマッチ
- [ぁ-んァ-ヶ一-龥々] | 角括弧に囲まれたかな、カナ、漢字のいずれかにマッチ(ヴ、ヵ、ヶ、々を含む)
- ?= | 直後に設定した文字が続く文字列にマッチ
- *? | 直前に設定した文字が0回以上続く文字列をチェックし、?の直後の文字が出た段階でその1文字を返す
この辺りは、まだまだ自分の中で理解が出来ていないため
今後実装時に、意味を理解しながら使っていくことで、
もっと詳しくなっていきたいと思います。