【正規表現】パスワードの正規表現をひもとく
こんばんわ!
今日はパスワードの正規表現について書いていきたいと思います。
参考サイトで「英数字それぞれ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を足せばパスワードの正規表現の完成です。