パスワード強度判定の正規表現と肯定的先読み

数字アルファベット大文字小文字を含む8文字以上の文字列にマッチする正規表現のメモ

条件は正規表現で書くと ^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])[!-~]{8,}$ となる。

これを可視化すると、

https://jex.im/regulex/ f:id:smitch:20200208123436p:plain

https://regexper.com f:id:smitch:20200208123431p:plain

となるが、肯定的先読みがregulexでは表示されていない。 regexper.comでもpositive lookaheadの表記があるのみ。

正規表現なんだからオートマトン で書けるでしょって思ったのだが、結構大変なようである。

中身をちゃんとは読めていないのだが、大きさmの正規表現が状態数O(22m)の決定的有限オートマトンになるらしい。

先読み付き正規表現の有限状態オートマトンへの変換 森畑 明昌, PPL2011 https://www.jstage.jst.go.jp/article/jssst/29/1/29_1_1_147/_pdf