【正規表現】パスワードの正規表現をひもとく

こんばんわ!
今日はパスワードの正規表現について書いていきたいと思います。

参考サイトで「英数字それぞれ1文字以上を含む8文字以上100文字以下の文字列」を正規表現で表すと下のようになるとあったので、今回はこれについてひもといて丸裸にしていきたいと思います。

/\A(?=.*[a-z])(?=.*\d)[a-z\d]{8,100}+\z/i



まず、単語ごとの意味を詳しく見ていきます。

文字 説明
. 任意の1文字にマッチ
+ 直前の文字が一回以上繰り返す場合にマッチ
* 直前の文字が0回以上繰り返す場合にマッチ
\A 文頭を示す
\z 文末を示す
{n, m} 直前の文字がn文字以上、m文字以下の場合にマッチ
[...] 角括弧の中の文字いずれか1文字にマッチ
\d 数字にマッチ
i 大文字小文字を区別しない検索



パスワードの正規表現ではAND(英字を1文字以上含むかつ数字を1文字以上含む)を表現するがあります。ANDを表現するのには位置指定子を使います。


位置指定子を使い、英字を1文字以上含むかつ数字を1文字以上含む場合、文頭をマッチさせる

位置指定子には大きく4種類ありますが、上の例で使われているのは肯定先読みなので、今回は肯定先読みを例を使って説明します。

肯定先読み

(?=条件)で表される位置指定子で位置を指定します。条件にマッチしたときその文字の前の位置を指定します。
例1) /(?=[a-z])/
(結果) 1234 a
.................↑

先読みというのは誤解しやすいですが、(自分も誤解してました)、前の位置を指定します。先読みはlook-aheadとした方が直感的に理解しやすいです。
次に肯定先読みをつかった検索の例を示します。
例2) /4(?=[a-z])/
(結果) 123 4 a
.................↑

4と例1の結果の位置で囲われた箇所がマッチするので、例2では4がマッチします。

例3) /\A(?=.*[a-z])/
(結果) abcde
.........↑

少し複雑になってきましたが、例3では英字が含まれていた場合、文頭にマッチします。

位置指定子は文字ではないため、複数条件を追加できます。この性質を利用してANDを表現できます。
例4) /\A(?=.*[a-z])(?=.*\d)/
(結果) abcde1
.........↑

例の4では、英字、数字いずれも一文字以上含まれていない限りマッチしません。


文字列全体をマッチさせる

ここまでで英字を1文字以上含むかつ数字を1文字以上含むと文頭にマッチさせることができています。ここまでくれば後は簡単です。

例5) /\A(?=.*[a-z])(?=.*\d)[a-z\d]+/
(結果) abcd123
..........文全体にマッチ

まず、例4)に[a-z\d]を足すことで、文頭とa~zまたは数字で囲まれた文字がマッチします。つまり、文の最初の文字(例でいうとa)のみがマッチします。そこに+をつけることで、文全体をマッチさせることができます。

また、8文字以上100文字以下という制限も加えたいので、{8, 100}を足します。
例6) /\A(?=.*[a-z])(?=.*\d)[a-z\d]{8,100}+/
(結果) abcd1234
..........文全体にマッチ

そして最後文末にメタ文字である\zを足せばパスワードの正規表現の完成です。


まとめ

以上がパスワードの正規表現を詳しく見てみた記事になります。
ここまで読んでくださり、ありがとうございました。
分かりにくいやアドバイス等ありましたらコメントくださると幸いです。では!