アウトプットを頑張る

初めてのプログラミング学習期間中の記録と、日頃読んでいる本をメモのアウトプットをがんばります。

【プログラミング学習】Webアプリケーションの正規表現使用 例2

■プログラミング学習 f:id:yuma6128:20211211095417j:plain

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回以上の繰り返しにマッチ
  • \A | 直後の文字が先頭にある文字列にマッチ
  • \z | 直前の文字が末尾にある文字列にマッチ
  • [ぁ-んァ-ヶ一-龥々] | 角括弧に囲まれたかな、カナ、漢字のいずれかにマッチ(ヴ、ヵ、ヶ、々を含む)
  • ?= | 直後に設定した文字が続く文字列にマッチ
  • *? | 直前に設定した文字が0回以上続く文字列をチェックし、?の直後の文字が出た段階でその1文字を返す

    この辺りは、まだまだ自分の中で理解が出来ていないため
    今後実装時に、意味を理解しながら使っていくことで、
    もっと詳しくなっていきたいと思います。